我在不同地区的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
当数据框x
和x2
合并为一个时,可能更容易想象我想要的内容:
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
循环有非常有限的经验,但这个问题对我来说已经证明过于复杂,而且解决这个问题非常关键,因为它是我研究前进的一个主要障碍。
非常感谢提前。
答案 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