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

时间:2016-08-01 04:45:56

标签: r loops dataframe data-cleaning

我在不同地区的350-600个农户中有几个由250个变量组成的数据集。数据非常混乱,并为分析提出了许多问题。我是R的新手,所以对下面的任何帮助都将不胜感激。

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

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>

我希望做的是遍历每个新生成的“输入”列,搜索匹配的输入(例如“肥料”或“农药”)并将结果以“是/否”格式提供给新的数据集(肥料,杀虫剂,除草剂和杂交种子)中4种输入中的每一种的变量。换句话说,上面x上的循环结果将为新创建的“是/否”变量生成以下列:

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),如果他们同时使用肥料和除草剂(如果他们使用肥料和农药但不使用除草剂,那么除草剂将是输入_2)农药将是Input_2等。如果家庭使用全部4个输入,它们将按以下顺序出现(见上文第4行):肥料,除草剂,杀虫剂,杂交种子。

我试图创建for循环来遍历所有4个输入变量,查找匹配的字符串,并在相关的新输入变量中输入“是”(例如,如果匹配则为新的“Fertilizers”变量对于“肥料”,可以在现有的4个“输入”变量中找到,但我没有取得多大成功。

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

非常感谢提前。

1 个答案:

答案 0 :(得分:1)

我们可以使用table

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

最好将其保留为二进制输出,而不是更改为“是/否”,但如果我们需要转换那么

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