gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:29:43 24 4
gpt4 key购买 nike

我有一个数据框列表(这里以 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 来做一个简单的比较(即检查第二列的值是否大于第三列),给定结果,添加一个新列标记(在示例中,新列称为“因子”。)

我快到了,但是我的脚本的输出是错误的,返回一个向量列表,而不是一个带有添加列的 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从你最内在的申请开始,但你是用一个简单的 <- 来做的运算符而不是 <<-运算符(operator)。前一个运算符不会影响函数范围之外的事物。我也不提倡使用 <<- (请参阅此处的替代解决方案)。

您遇到的另一个问题是您没有指定 dfx 的哪一行内部更新 apply ,所以即使你有 <<-每一行都会被更新,你最终会得到最后一个测试比较产生的最终值。

最后,您将返回 apply 的结果而不是修改后的 dfx在您的 lapply .

在这里,我们应用 transform函数给每个数据框添加一个 factor列基于数据框中第 3 和第 4 列的值(此处按名称引用)。请注意我如何使用 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这样我就可以跟踪行号。同样,我不推荐这种方法,但它是出于解释的目的。

关于R:使用 lapply 创建新列和值并应用嵌套在 data.frame 列表上,错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21534271/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com