r - 将多个 for 循环压缩为一个更简单的 for 循环,以在 R 中的另一个数据帧中存在的数据帧中分配值
问题描述
对于这个特定的数据问题,我希望将我的 for 循环简化为一个 for 循环。
这是我要编辑的原始数据框:
df1 <- data.frame(Id=c('bird1','bird2','bird3','bird4','bird5','bird6','bird7'),Sex=c('M','M','F','F','F','F','F'),YR05=c(1,0,3,1,1,1,1),YR06=c(0,1,0,0,2,0,3),'mass05_1'=c(1,0,3,1,1,1,1), 'mass05_2'=c(1,0,3,1,1,1,1),'mass05_3'=c(1,0,3,1,1,1,1),'mass06_1'=c(0,1,0,0,2,0,3),'mass06_2'=c(0,1,0,0,2,0,3),'mass06_3'=c(0,1,0,0,2,0,3),stringsAsFactors=T)
Id Sex YR05 YR06 mass05_1 mass05_2 mass05_3 mass06_1 mass06_2 mass06_3
1 bird1 M 1 0 1 1 1 0 0 0
2 bird2 M 0 1 0 0 0 1 1 1
3 bird3 F 3 0 3 3 3 0 0 0
4 bird4 F 1 0 1 1 1 0 0 0
5 bird5 F 1 2 1 1 1 2 2 2
6 bird6 F 1 0 1 1 1 0 0 0
7 bird7 F 1 3 1 1 1 3 3 3
每只鸟在 2005 年和 2006 年的地点 1,2 或 3 中被重新观察。我需要根据重新观察的位置为每只鸟附上每年每个地点的平均鸟类质量,因此复制的质量列。
我正在使用这个数据框来收集群众:
df2 <- data.frame(Year=c('YR05','YR06','YR05','YR06','YR05','YR06'),Site=c(1,1,2,2,3,3),Mass=c(743,735,658,620,542,556))
Year Site Mass
1 YR05 1 743
2 YR06 1 735
3 YR05 2 658
4 YR06 2 620
5 YR05 3 542
6 YR06 3 556
最后这是我想要的输出:
output <- data.frame(Id=c('bird1','bird2','bird3','bird4','bird5','bird6','bird7'),Sex=c('M','M','F','F','F','F','F'),YR05=c(1,0,3,1,1,1,1),YR06=c(0,1,0,0,2,0,3),'mass05_1'=c(743,0,0,743,743,743,743), 'mass05_2'=c(0,0,0,0,0,0,0),'mass05_3'=c(0,0,542,0,0,0,0),'mass06_1'=c(0,735,0,0,0,0,0),'mass06_2'=c(0,0,0,0,620,0,0),'mass06_3'=c(0,0,0,0,0,0,556),stringsAsFactors=T)
Id Sex YR05 YR06 mass05_1 mass05_2 mass05_3 mass06_1 mass06_2 mass06_3
1 bird1 M 1 0 743 0 0 0 0 0
2 bird2 M 0 1 0 0 0 735 0 0
3 bird3 F 3 0 0 0 542 0 0 0
4 bird4 F 1 0 743 0 0 0 0 0
5 bird5 F 1 2 743 0 0 0 620 0
6 bird6 F 1 0 743 0 0 0 0 0
7 bird7 F 1 3 743 0 0 0 0 556
我在每一列上做了这些 for 循环:
for (i in 5){
df1[,i][which(df1[,i] %nin% 1)] <- 0
df1[,i][which(df1[,i] %in% 1)] <- 743
}
for (i in 6){
df1[,i][which(df1[,i] %nin% 2)] <- 0
df1[,i][which(df1[,i] %in% 2)] <- 658
}
for (i in 7){
df1[,i][which(df1[,i] %nin% 3)] <- 0
df1[,i][which(df1[,i] %in% 3)] <- 542
}
for (i in 8){
df1[,i][which(df1[,i] %nin% 1)] <- 0
df1[,i][which(df1[,i] %in% 1)] <- 735
}
for (i in 9){
df1[,i][which(df1[,i] %nin% 2)] <- 0
df1[,i][which(df1[,i] %in% 2)] <- 620
}
for (i in 10){
df1[,i][which(df1[,i] %nin% 3)] <- 0
df1[,i][which(df1[,i] %in% 3)] <- 556
}
这给了我想要的结果,但我不确定如何将这些循环压缩成一个 for 循环,我的数据集中有 200 多列跨越多年,因此逐列执行此操作将不起作用。我需要一个更通用的 for 循环来编辑数据。
解决方案
推荐阅读
- reactjs - 有没有办法从作为泛型传递的接口推断特定值的类型?
- r - R中的序列变化编码
- python - “小于”运算符在 Python 中不起作用
- html - 如何在 Vuetify.js 中使文本换行到下一行
- c# - System.Text.Json 序列化 Unicode 字符(如表情符号)的问题
- .net - 为什么为日期类型对象分配一个值不能正确地获得它的值?
- python - 如何生成包含连续数字和字母混合的列表?
- javascript - Three.js中点的局部到全局(反之亦然)矩阵变换
- autodesk-forge - 为什么我的线宽不显示在 2D Forge Viewer 中?
- python - 与其他表达式进行 OR 运算时,Python 正则表达式与组不匹配