首页 > 解决方案 > 将多个 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 循环来编辑数据。

标签: rdataframefor-loop

解决方案


推荐阅读