r - 双循环填充数据框 - 如何修复“复杂分配中的无效函数”
问题描述
我有一个数据框:
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
.
在我的情况下,我检查了 2016 年的问题编号(或变量名称的前几个字符)是否与结果 2 中的 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")
}
但我收到此错误消息:
absdiff$substr(colnames(results2[q]), 1, 11) <- abs(results2[j, : 复杂赋值中的无效函数) 中的错误
什么问题导致此错误消息?我如何解决它?
为了复制,这一切都可以简化为:
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
推荐阅读
- python - 尝试使用 pandas 读取 csv 文件时出错
- python - Pandas 中一列中从一个值到另一个值的转换计数
- python - f-string将舍入的浮点数恢复为未舍入的
- flutter - 我如何将 file.path 用于列表
? - sql - 如何内连接两个匿名表 [SQL]
- c# - .NET 核心中 MySQL.Data 的“无法加载文件或程序集”问题
- python - 如何在 Python 中使用命令行读取腌制文件?
- android - Kotlinx Serialization @Body converter error while using HashMap with Any type
- java - 未能在项目时间表上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile)
- flutter - 如何防止多列和列表视图出现这种溢出错误?