如何遍历数据框中的列子集以创建新变量

How to loop over a subset of columns in a data frame to create new variables

我有几个数据集,其中包含大约 250 个变量,涉及不同地区的 350-600 个农户。数据非常混乱,给分析带来了很多问题。我是 R 的新手,所以在下面的任何帮助将不胜感激。

最初,有几个列包含多个变量,例如"Inputs" 列包含 最多 4 个单独的输入(肥料、除草剂、杀虫剂和杂交种子)。我使用 tidyr 中的 spread() 函数创建了 4 个新变量 (Input_1... Input_4)。由此产生的新 "Input" 变量类似于以下 模拟的 数据框,其中每一行代表一个农户:

Input_1 <- c("Fertilisers", "Fertilisers", "Fertilisers", "Fertilisers", NA)
Input_2 <- c("Hybrid_Seeds", "Hybrid_Seeds", "Pesticides", "Herbicides", NA) 
Input_3 <- c(NA, NA, NA, "Pesticides", NA)
Input_4 <- c(NA, NA, NA, "Hybrid_Seeds", NA)

x <- data.frame(Input_1, Input_2, Input_3, Input_4)

x

      Input_1      Input_2    Input_3      Input_4
1 Fertilisers Hybrid_Seeds       <NA>         <NA>
2 Fertilisers Hybrid_Seeds       <NA>         <NA>
3 Fertilisers   Pesticides       <NA>         <NA>
4 Fertilisers   Herbicides Pesticides Hybrid_Seeds
5        <NA>         <NA>       <NA>         <NA>

我希望做的是遍历每个新生成的 "Input" 列,搜索匹配的输入(例如 "Fertilisers" 或 "Pesticides")并将结果输入"Yes/No" 为数据集中的 4 种输入类型(化肥、杀虫剂、除草剂和杂交种子)中的每一种设置新变量格式。换句话说,上面 x 循环的结果将为新创建的 "Yes/No" 变量生成以下列:

Fertilisers <- c("Yes", "Yes", "Yes", "Yes", "No")
Herbicides <- c("No", "No", "No", "Yes", "No")
Pesticides <- c("No", "No", "Yes", "Yes", "No")
Hybrid_Seeds <- c("Yes", "Yes", "No", "Yes", "No")

x2 <- data.frame(Fertilisers, Herbicides, Pesticides, Hybrid_Seeds) 

x2

  Fertilisers Herbicides Pesticides Hybrid_Seeds
1         Yes         No         No          Yes
2         Yes         No         No          Yes
3         Yes         No        Yes           No
4         Yes        Yes        Yes          Yes
5          No         No         No           No

当数据框 xx2 合并为一个时,可能更容易想象我想要什么:

x3 <- data.frame(x, x2)

x3

      Input_1      Input_2    Input_3      Input_4 Fertilisers Herbicides
1 Fertilisers Hybrid_Seeds       <NA>         <NA>         Yes         No
2 Fertilisers Hybrid_Seeds       <NA>         <NA>         Yes         No
3 Fertilisers   Pesticides       <NA>         <NA>         Yes         No
4 Fertilisers   Herbicides Pesticides Hybrid_Seeds         Yes        Yes
5        <NA>         <NA>       <NA>         <NA>          No         No
  Pesticides Hybrid_Seeds
1         No          Yes
2         No          Yes
3        Yes           No
4        Yes          Yes
5         No           No

这 4 种投入遵循一定的顺序,即如果家庭使用肥料,肥料将始终是第一个 (Input_1),如果他们同时使用肥料和除草剂,则除草剂将是 Input_2(如果他们使用肥料和杀虫剂但不使用除草剂,那么杀虫剂将是 Input_2,等等。如果家庭使用所有 4 种投入,它们将按以下顺序出现(见上文第 4 行):化肥、除草剂、杀虫剂、Hybrid_Seeds.

我试图创建 for 循环来遍历所有 4 个输入变量,查找匹配的字符串,并在关联的新输入变量(例如新的 "Fertilisers" 变量,如果在 4 个现有 "Input" 变量中的任何一个中找到 "Fertilisers" 的匹配项),但我没有取得太大的成功。

这个问题似乎没有 apply 家庭解决方案,但我很乐意得到纠正。同样,我是 R 和一般编程的新手,所以任何帮助将不胜感激。我对 for 循环有(非常有限的)经验,但事实证明这个问题对我来说过于复杂,解决它非常关键,因为它是我研究前进的主要障碍。

非常感谢。

我们可以使用table

tbl <- table(row(x), as.character(unlist(x)))

最好保留为二进制输出而不是更改为'Yes/No',但如果我们需要转换则

tbl[] <- c("No", "Yes")[tbl+1]

这可以转换为data.frame

as.data.frame.matrix(tbl)
#    Fertilisers Herbicides Hybrid_Seeds Pesticides
#1         Yes         No          Yes         No
#2         Yes         No          Yes         No
#3         Yes         No           No        Yes
#4         Yes        Yes          Yes        Yes
#5          No         No           No         No