如何遍历数据框中的列子集以创建新变量
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
当数据框 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),如果他们同时使用肥料和除草剂,则除草剂将是 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
我有几个数据集,其中包含大约 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
当数据框 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),如果他们同时使用肥料和除草剂,则除草剂将是 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