在R中使用for循环来处理数据帧中的几列

时间:2019-09-11 12:02:14

标签: r loops for-loop

我正在尝试使用for循环函数,根据与50个值的给定向量的精确匹配,将数据框中的50列编辑为虚拟变量。 我以前从未使用过循环函数,也无法弄清楚该如何做。

我首先想为50列中的每一列“手工编写”此代码:

dBGK1a <- as.numeric(BGK1a == BGKright[1])
dBGK2a <- as.numeric(BGK2a == BGKright[2])
dBGK3a <- as.numeric(BGK3a == BGKright[3])
....
dBGK50a <- as.numeric(BGK50a == BGKright[50])

因为这非常繁琐,所以我试图提出一个for循环,可以处理这个问题。

for(i in 1:50) {
for (j in seq(from = 348, to = 448, by = 2)){
  data1[j] <- as.numeric(data1[j] == BGKright[i])
    }
}

由于我在每次观察的每一列中都获得了值“ 0”,因此这不起作用。

data1是我的数据框。这是数据框的简短版本:

dput(head(data1[348:354], 20))

structure(list(BGK1a = c(NA, NA, NA, NA, NA, NA, NA, NA, 2, NA, 
NA, NA, NA, NA, 2, 2, 2, 2, 1, 2), BGK1b = c(NA, NA, NA, NA, 
NA, NA, NA, NA, 50, NA, NA, NA, NA, NA, 100, 100, 100, 99, 89, 
50), BGK2a = c(NA, NA, NA, NA, NA, NA, NA, NA, 1, NA, NA, NA, 
NA, NA, 1, 2, 1, 2, 1, 1), BGK2b = c(NA, NA, NA, NA, NA, NA, 
NA, NA, 50, NA, NA, NA, NA, NA, 100, 50, 96, 62, 93, 50), BGK3a = c(NA, 
NA, NA, NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, 2, 1, 1, 1, 
1, 2), BGK3b = c(NA, NA, NA, NA, NA, NA, NA, NA, 50, NA, NA, 
NA, NA, NA, 100, 100, 50, 85, 82, 74), BGK4a = c(NA, NA, NA, 
NA, NA, NA, NA, NA, 2, NA, NA, NA, NA, NA, 1, 2, 2, 2, 1, 1)), row.names = c(NA, 
-20L), class = c("tbl_df", "tbl", "data.frame"))

循环应该做的是用“ i”选择“ BGKright”的相应值,并用“ j”选择要处理的列。请注意,“ j”每个循环需要跳转2个步骤,因为我只需要处理每隔一列(从第348列到第448列)。

对于此循环以及此任务无循环可能提供的其他解决方案,我将不胜感激。
预先谢谢你。

1 个答案:

答案 0 :(得分:0)

好吧,我使用BGKa=select(data1[348:448],ends_with("a"))来制作一个仅包含相关列的新数据框。

然后,我使用for循环创建了虚拟对象。

for(i in 1:50) {
    BGKa[i]=as.numeric(BGKa[i]==BGKright[i])
  }

似乎可以正常工作。请帮忙。

相关问题