Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按列计算数据帧列表中每个数据帧的列中值绝对偏差(MAD)_R_Dataframe_Lapply - Fatal编程技术网

R 按列计算数据帧列表中每个数据帧的列中值绝对偏差(MAD)

R 按列计算数据帧列表中每个数据帧的列中值绝对偏差(MAD),r,dataframe,lapply,R,Dataframe,Lapply,我想通过忽略数据帧列表中每个数据帧的第一列来计算中位数绝对偏差(mscore)。然后将结果作为新行添加到数据框中,行名为mscore 以前我会一次一个地对每个数据帧进行计算,但现在它简化了计算过程 下面是我的数据帧列表的一小部分摘录。dfs的完整列表有30多个数据帧 表(Al2O3=结构)表(测定值=1:6,`2`=c(2.01, 2.02,2.03,2.01,2.02,2),`3`=c(2.01,2.01,2,2.02,2.02, 2.03),`4`=c(2,2.03,1.99,2.01,2

我想通过忽略数据帧列表中每个数据帧的第一列来计算中位数绝对偏差(mscore)。然后将结果作为新行添加到数据框中,行名为mscore

以前我会一次一个地对每个数据帧进行计算,但现在它简化了计算过程

下面是我的数据帧列表的一小部分摘录。dfs的完整列表有30多个数据帧


表(Al2O3=结构)表(测定值=1:6,`2`=c(2.01,
2.02,2.03,2.01,2.02,2),`3`=c(2.01,2.01,2,2.02,2.02,
2.03),`4`=c(2,2.03,1.99,2.01,2.01,2.01),`5`=c(2.02,
2.02,2.05,2.03,2.02,2.03),`7`=c(1.88,1.9,1.89,1.88,
1.88,1.87),`8`=c(2.053,2.044,2.041,2.038,2.008,2.02),
`10`=c(2.002830415、2.021725042、2.021725042、1.983935789、,
2.002830415,2.021725042),`12`=c(2.09,2.05,1.96,2.09,
2.06,2.02),class=“data.frame”,row.names=c(NA,-6L
)),As=结构(列表)(确定号=1:6,`2`=c(0.052,
0.027,0.011,0.011,0.012,0.012),`3`=c(0.012,0.012,0.013,
0.012,0.013,0.013),`4`=c(0.012,0.012,0.013,0.012,0.012,
0.012),`5`=c(0.013,0.013,0.013,0.013,0.013,0.013,0.013),`7`=c(0.011,,
0.011,0.011,0.012,0.011,0.011),`8`=c(0.011,0.01,0.011,
0.011,0.011,0.011),`10`=c(0.01,0.01,0.01,0.01,0.01,
0.01),`12`=c(NA_real,NA_real,NA_real,NA_real,NA_real,
NA_real_)),class=“data.frame”,row.names=c(NA,-6L)),Fe=structure(list(
测定值=1:6,`2`=c(55.94,55.7,56.59,56.5,
55.98,55.93),`3`=c(56.83,56.54,56.18,56.5,56.51,
56.34),`4`=c(56.39,56.43,56.53,56.31,56.47,56.35),
`5`=c(56.32,56.29,56.31,56.32,56.39,56.32),`7`=c(56.48,
56.4,56.54,56.43,56.73,56.62),`8`=c(56.382,56.258,
56.442,56.258,56.532,56.264),`10`=c(56.3,56.5,56.2,
56.5,56.7,56.5),`12`=c(56.11,56.46,56.1,56.35,56.36,
56.37),class=“data.frame”,row.names=c(NA,-6L)))
以前我会做以下的事情

lapply(A, function(x) {x[nrow(x) + 1,] <- apply(x, 2, function(y) median(y, na.rm = TRUE)); 
                  x <- x[,-1]; 
                  rownames(x)[nrow(x)] <- "mscores"; 
                          return(x)})
#创建修改后的分数函数以接受NAs
得分\u na尝试以下方法

lapply(A, function(x) {x[nrow(x) + 1,] <- apply(x, 2, function(y) median(y, na.rm = TRUE)); 
                  x <- x[,-1]; 
                  rownames(x)[nrow(x)] <- "mscores"; 
                          return(x)})

到目前为止,将函数应用于
data.frame
中的所有或某些列的标准方法是
lappy

我不认为
mapply
在这里有用:它的第一个参数需要是
函数
,未赋值,而不是
中值(.)
中的求值表达式。不过,我认为我们可以使用
lappy

仅供参考,这两个调用在
mappy
lappy
之间是等价的:

lapply(列表(1:2,3:4),总和)
映射(总和,列表(1:2,3:4))
但是,只有
mapply
可以直接执行此操作(
lappy
可以使用索引而不是原始数据执行此操作):

映射(函数(x,y)和(x)+y,列表(1:2,3:4),列表(5,6))
它“展开”成

sum(1:2)+5
总和(3:4)+6
我的第一步是聚合数据,这非常简单

tmp 2.015 2.015 2.01 2.025 1.88 2.0395 2.012278 2.055
#$As
#第2 3 4 5 7 8 10 12号决定
#1 1 0.052 0.0120 0.012 0.013 0.011 0.011 0.01 NA
#2 0.027 0.0120 0.012 0.013 0.011 0.010 0.01 NA
#3 0.011 0.0130 0.013 0.013 0.011 0.011 0.01 NA
#4 0.011 0.0120 0.012 0.013 0.012 0.011 0.01 NA
#5 0.012 0.0130 0.012 0.013 0.011 0.011 0.01 NA
#6 0.012 0.0130 0.012 0.013 0.011 0.011 0.01 NA
#7作为中值-->0.012 0.0125 0.012 0.013 0.011 0.011 0.01 NA
#$Fe
#第2 3 4 5 7 8 10 12号决定
# 1                1 55.94 56.830 56.39 56.32 56.48 56.382 56.3 56.110
# 2                2 55.70 56.540 56.43 56.29 56.40 56.258 56.5 56.460
# 3                3 56.59 56.180 56.53 56.31 56.54 56.442 56.2 56.100
# 4                4 56.50 56.500 56.31 56.32 56.43 56.258 56.5 56.350
# 5                5 55.98 56.510 56.47 56.39 56.73 56.532 56.7 56.360
# 6                6 55.93 56.340 56.35 56.32 56.62 56.264 56.5 56.370
#7 Fe中值-->55.96 56.505 56.41 56.32 56.51 56.323 56.5 56.355

使用表呈现工具,例如
knitr::kable
gt
包、
DT
(如果在html环境中使用此工具)和其他工具,可以完成更多的工作。

FYI,代码块由三个反勾(
`
)的代码栏分隔,不是这里的单引号;请参见。@r2evans道歉无需道歉!我只是建议设置问题格式。如果问题过于急迫,我道歉,我可以回滚。@r2evans不,您没有。反馈和编辑很有用。我正在寻求帮助,以便每个人都能越容易越好使用
mappy
,但这是错误的可以很容易地进行修正(第一个参数必须是函数,而不是函数调用的结果,但我不认为您需要
mapply
lappy
应该起作用)。但是…rbinding a row and add a row name是一回事,但是row name很容易丢失。我通常不喜欢将摘要统计作为一行添加到实际数据中,rbinding row仅仅是为了在报表中显示/呈现吗?谢谢。您的解决方案计算了中位数,并允许我指定row name,这是一个很大的帮助不客气。如果它解决了您的问题,您可以通过向上投票并接受答案来表明这一点。不幸的是,这只是我需要的答案的一半。除了每个data.frame的中值和删除第一列之外,您还需要什么?您可以更新初始问题以反映这一点。
    > lapply(A, function(x) {x[nrow(x) + 1,] <- apply(x, 2, function(y) median(y, na.rm = TRUE)); x <- x[,-1]; rownames(x)[nrow(x)] <- "mscores"; return(x)})
$Al2O3
            2     3    4     5    7      8       10    12
1       2.010 2.010 2.00 2.020 1.88 2.0530 2.002830 2.090
2       2.020 2.010 2.03 2.020 1.90 2.0440 2.021725 2.050
3       2.030 2.000 1.99 2.050 1.89 2.0410 2.021725 1.960
4       2.010 2.020 2.01 2.030 1.88 2.0380 1.983936 2.090
5       2.020 2.020 2.01 2.020 1.88 2.0080 2.002830 2.060
6       2.000 2.030 2.01 2.030 1.87 2.0200 2.021725 2.020
mscores 2.015 2.015 2.01 2.025 1.88 2.0395 2.012278 2.055

$As
            2      3     4     5     7     8   10 12
1       0.052 0.0120 0.012 0.013 0.011 0.011 0.01 NA
2       0.027 0.0120 0.012 0.013 0.011 0.010 0.01 NA
3       0.011 0.0130 0.013 0.013 0.011 0.011 0.01 NA
4       0.011 0.0120 0.012 0.013 0.012 0.011 0.01 NA
5       0.012 0.0130 0.012 0.013 0.011 0.011 0.01 NA
6       0.012 0.0130 0.012 0.013 0.011 0.011 0.01 NA
mscores 0.012 0.0125 0.012 0.013 0.011 0.011 0.01 NA

$Fe
            2      3     4     5     7      8   10     12
1       55.94 56.830 56.39 56.32 56.48 56.382 56.3 56.110
2       55.70 56.540 56.43 56.29 56.40 56.258 56.5 56.460
3       56.59 56.180 56.53 56.31 56.54 56.442 56.2 56.100
4       56.50 56.500 56.31 56.32 56.43 56.258 56.5 56.350
5       55.98 56.510 56.47 56.39 56.73 56.532 56.7 56.360
6       55.93 56.340 56.35 56.32 56.62 56.264 56.5 56.370
mscores 55.96 56.505 56.41 56.32 56.51 56.323 56.5 56.355