如何在 R 中将函数的应用向下移动一行
How to shift the application of a function down a row in R
如果我有一个要应用函数的数据框或数据框列表,例如:
df1
start stop ID
0 10 x
10 20 y
20 30 z
df2
start stop ID
0 10 a
10 20 b
20 30 c
假设我使用函数:
mylist=list(df1,df2)
mylist <- lapply(mylist, function(x) {x$Avg<-(((x[,1]+x[,2]))/2) ; return(x)})
这给了我输出:
df1
start stop ID Avg
0 10 x 5
10 20 y 15
20 30 z 25
df2
start stop ID Avg
0 10 a 5
10 20 b 15
20 30 c 25
但我希望它显示下面行的平均值,这样输出就是这样(我不关心不可计算行中的内容):
df1
start stop ID Avg
0 10 x 15
10 20 y 25
20 30 z NA
df2
start stop ID Avg
0 10 a 15
10 20 b 25
20 30 c NA
我该怎么做?它需要在 lapply 中,因为我将对几十个数据帧进行处理。谢谢
您可以从输出中删除第一个元素 ([-1]
) 并与 NA 连接。如果您有 NA 值,则在前两列上执行 rowMeans
可能很有用,因为它可以选择删除 NA 值 (na.rm=TRUE
).
lapply(mylist, function(x) { x$Avg <-c(rowMeans(x[-3])[-1],NA)
x})
#[[1]]
# start stop ID Avg
#1 0 10 x 15
#2 10 20 y 25
#3 20 30 z NA
#[[2]]
# start stop ID Avg
#1 0 10 a 15
#2 10 20 b 25
#3 20 30 c NA
如果我有一个要应用函数的数据框或数据框列表,例如:
df1
start stop ID
0 10 x
10 20 y
20 30 z
df2
start stop ID
0 10 a
10 20 b
20 30 c
假设我使用函数:
mylist=list(df1,df2)
mylist <- lapply(mylist, function(x) {x$Avg<-(((x[,1]+x[,2]))/2) ; return(x)})
这给了我输出:
df1
start stop ID Avg
0 10 x 5
10 20 y 15
20 30 z 25
df2
start stop ID Avg
0 10 a 5
10 20 b 15
20 30 c 25
但我希望它显示下面行的平均值,这样输出就是这样(我不关心不可计算行中的内容):
df1
start stop ID Avg
0 10 x 15
10 20 y 25
20 30 z NA
df2
start stop ID Avg
0 10 a 15
10 20 b 25
20 30 c NA
我该怎么做?它需要在 lapply 中,因为我将对几十个数据帧进行处理。谢谢
您可以从输出中删除第一个元素 ([-1]
) 并与 NA 连接。如果您有 NA 值,则在前两列上执行 rowMeans
可能很有用,因为它可以选择删除 NA 值 (na.rm=TRUE
).
lapply(mylist, function(x) { x$Avg <-c(rowMeans(x[-3])[-1],NA)
x})
#[[1]]
# start stop ID Avg
#1 0 10 x 15
#2 10 20 y 25
#3 20 30 z NA
#[[2]]
# start stop ID Avg
#1 0 10 a 15
#2 10 20 b 25
#3 20 30 c NA