gpt4 book ai didi

r - 双循环填充数据框 - 如何修复 "invalid function in complex assignment"

转载 作者:行者123 更新时间:2023-12-04 09:46:06 25 4
gpt4 key购买 nike

我有一个数据框:

results 2 (612 obs. 281 variables)
ID Q1000_p2000_2016 Q1893_p2039_2016 .... Q1000_p2000_2017 Q1893_p2039_2017
1 392 381 422 351
2 432 293 398 310
. . . . .
. . . . .

2016 年有 140 个问题,2017 年有 140 个问题,每年的问题都使用相同的名称,但每个变量名称都有 “_2016”“_2017”结束区分时间段。

和另一个数据框:

absdiff (0 obs. 141 variables)
ID Q1000_p2000 Q1893_p2039 ....

对于每个 ID 的每个问题,我想通过取两年的绝对差值在 absdiff 中分配一个值。

在我的情况下,我检查 2016 年的问题编号(或变量名称的前几个字符)是否与 results2 中的 2017 年的问题编号匹配。

如果成立,我想将两个答案的绝对差分配给absdiff中相应的变量/问题编号

我用过

for (q in 2:141){
if (substr(colnames(results2[q]),1,12) == substr(colnames(results2[q+140]),1,12)){
for (j in 1:nrow(results2)){absdiff$substr(colnames(results2[q]),1,11) <- abs(results2[j,q] - results2[j,(q+140)])}
}
else
print("ERROR")
}

但我收到此错误消息:

Error in absdiff$substr(colnames(results2[q]), 1, 11) <- abs(results2[j, : invalid function in complex assignment

什么问题导致了这个错误信息?我该如何解决?

为了复制,这一切都可以简化为:

ID <- c(1,2)
Q1000_p2000_2016 <- c(392,432)
Q1893_p2039_2016 <- c(381,293)
Q1000_p2000_2017 <- c(422,398)
Q1893_p2039_2017 <- c(351,310)

results2 <- as.data.frame(cbind(ID, Q1000_p2000_2016, Q1893_p2039_2016 ,Q1000_p2000_2017, Q1893_p2039_2017 ))

absdiff <- results2[FALSE,1:3]

for (q in 2:3){
if (substr(colnames(results2[q]),1,12) == substr(colnames(results2[q+2]),1,12)){
for (j in 1:nrow(results2)){absdiff$substr(colnames(results2[q]),1,11) <- abs(results2[j,q] - results2[j,(q+2)])}
}
else
print("ERROR")
}

最佳答案

不要使用循环,而只是矢量化。获取 2016 列、2017 列然后相减:

col2016<-grep("_2016$",names(results2),value=TRUE)
col2017<-grep("_2017$",names(results2),value=TRUE)
absdiff<-results2[,col2017]-results2[,col2016]
# Q1000_p2000_2017 Q1893_p2039_2017
#1 30 -30
#2 -34 17

要保留ID列,只需在后面添加:

absdiff$ID<-results2$ID

关于r - 双循环填充数据框 - 如何修复 "invalid function in complex assignment",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55628549/

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