[英]R - transform a list of variable vectors to data.frame with additional column by nested lapply
[英]R:create new column and value using lapply & apply nested on data.frame list, wrong output
我有一个数据框列表(这里以2为例)。
df1 <- read.table(text= "var,X2x,X4x,X6x
101337,4.631833,4.4547,11.097333
345754,3.727433,10.8560,10.536600" ,header=TRUE, sep=",")
df2 <- read.table(text= "var,X2x,X4x,X6x
101337,5.631833,10.4547,11.097333
345754,5.727433,12.8560,10.536600" ,header=TRUE, sep=",")
dflist <- list(df1=df1, df2=df2)
我想使用lapply来浏览每个data.frame并使用apply进行简单的比较(即检查第二列的值是否大于第三列),给定结果,添加一个新的列tag(在示例中,然后新列称为“factor”。)
我几乎在那里,但是我的脚本的输出是错误的,返回一个向量列表而不是带有添加列的data.frames列表。
这是代码:
dfL <- lapply(dflist,function(dfx) {
apply(dfx,1, function(df) { if(df[3] < (df[4] )) {
dfx$factor<-"nonNA"} else {dfx$factor<-"NA"}
}
)
}
)
你能解释一下我做错了什么吗?
您的方法存在一些问题。 第一个是你从最里面的应用程序修改dfx
,但是你使用一个简单的<-
运算符而不是<<-
运算符。 前一个运算符不会影响函数范围之外的事物。 我也不会提倡使用<<-
(请参阅此处的替代解决方案)。
你遇到的另一个问题是你没有指定要在里面更新的dfx
行apply
,所以即使你有<<-
每行都会得到更新,你最终会得到最后一个值,无论上次测试比较是什么产生的。
最后,您将在dfx
中返回apply
的结果而不是修改后的lapply
。
这里,我们将transform
函数应用于每个数据帧,以根据数据框中第3和第4列的值添加factor
列(此处按名称引用)。 注意我是如何使用ifelse
来避免内部apply
:
lapply(dflist, transform, factor=ifelse(X4x < X6x, "nonNA", "NA"))
# $df1
# var X2x X4x X6x factor
# 1 101337 4.631833 4.4547 11.09733 nonNA
# 2 345754 3.727433 10.8560 10.53660 NA
#
# $df2
# var X2x X4x X6x factor
# 1 101337 5.631833 10.4547 11.09733 nonNA
# 2 345754 5.727433 12.8560 10.53660 NA
这是一个不必要的变化,它更接近你想要做的事情,比较/对比,希望你能更清楚地看到为什么你的工作不起作用:
lapply(dflist,
function(dfx) {
dfx$factor <- ""
lapply(1:nrow(dfx),
function(row.id) {
dfx[row.id, "factor"] <<-
if(dfx[row.id, 3] < dfx[row.id, 4]) "nonNA" else "NA"
} )
dfx
} )
注意我是如何lapply
在内部循环,而不是apply
,这样我可以跟踪的行号。 同样,我不推荐这种方法,但它是出于解释目的。
你可以尝试这样的事情。 您不需要apply
矢量化操作。
lapply(dflist, function(x){
x$grp <- "not smaller"
x$grp[x[ , 3] < x[ , 4]] <- "smaller"
x
})
# $df1
# var X2x X4x X6x grp
# 1 101337 4.631833 4.4547 11.09733 smaller
# 2 345754 3.727433 10.8560 10.53660 not smaller
#
# $df2
# var X2x X4x X6x grp
# 1 101337 5.631833 10.4547 11.09733 smaller
# 2 345754 5.727433 12.8560 10.53660 not smaller
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.