繁体   English   中英

R:使用lapply创建新列和值,并在data.frame列表中应用嵌套,输出错误

[英]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 ,但是你使用一个简单的<-运算符而不是<<-运算符。 前一个运算符不会影响函数范围之外的事物。 我也不会提倡使用<<- (请参阅此处的替代解决方案)。

你遇到的另一个问题是你没有指定要在里面更新的dfxapply ,所以即使你有<<-每行都会得到更新,你最终会得到最后一个值,无论上次测试比较是什么产生的。

最后,您将在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM