将具有 X 个唯一值的列解析为 X 个新列,并填充来自另一列 R 的值
Parse a column with X unique values into X new columns, populated with values from another column R
我想获取具有 X 个唯一值的列 (A),并创建 X 个新列,然后使用另一列 (B) 中的值填充这些新列中的每一个。我一直在努力在搜索中阐明这个问题,但还没有找到任何东西,所以这里有一些示例数据来说明我实际尝试做的事情。
我有一个农业产量(响应变量)的数据框,来自几年的几种处理。我还有一年中不同月份(第 1、2、3 个月)的农业投入(预测变量)数据框。最终,我希望能够 运行 像 Yield ~ Input_mo1 * Input_mo2
这样的模型,所以我试图创建单独的列来显示每个月的输入(即 Input_mo1
是月份的输入年度第 1 名)。
这是我的两个输入数据框:
yield.vector <- c(95, 6, 40, 34, 61, 16, 29, 69, 77, 54, 29, 94, 16, 61, 49, 18, 51, 87)
input.vector <- c(9, 6, 7, 3, 6, 2, 2, 9, 2, 1, 5, 2, 1, 2, 6, 4, 5, 1)
data.yield <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Yield = yield.vector)
data.inputs <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Month = rep(1:3,6),
Input = input.vector)
我想创建这种合并数据框,其中每个月的输入都有产量和一列:
data.output <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Yield = yield.vector,
Input_mo1 = c(9,3,9,3,9,3,2,1,2,1,2,1,1,4,1,4,1,4),
Input_mo2 = c(6,6,6,6,6,6,5,9,5,9,5,9,5,2,5,2,5,2),
Input_mo3 = c(1,4,1,4,1,4,5,2,5,2,5,2,6,1,6,1,6,1))
data.output
您会注意到在输出数据框中,大部分数据是重复的,因为每年每个处理有 3 个重复,并且它们都在给定的 month_year 内接收相同的输入。输出列的名称无关紧要,只要我能区分它们并在以后重命名即可。
我花了几个小时试图弄清楚如何做到这一点,但我总是遇到死胡同。如果您能提供任何帮助,我将不胜感激。谢谢。
使用 tidyverse
您可以尝试以下操作。您可以使用 pivot_wider
将 3 个月的数据放在单独的列中。然后,您可以将两个数据框连接在一起。数据与您的 data.output
data.frame 不完全匹配 - 如果我遗漏了什么,请告诉我。
library(tidyverse)
data.inputs %>%
pivot_wider(id_cols = c(Year, Treatment),
names_from = Month,
values_from = Input,
names_prefix = "Input_mo") %>%
right_join(data.yield)
输出
Year Treatment Input_mo1 Input_mo2 Input_mo3 Yield
<dbl> <int> <dbl> <dbl> <dbl> <dbl>
1 2020 1 9 6 7 95
2 2020 1 9 6 7 40
3 2020 1 9 6 7 61
4 2020 2 3 6 2 6
5 2020 2 3 6 2 34
6 2020 2 3 6 2 16
7 2019 1 2 5 2 29
8 2019 1 2 5 2 77
9 2019 1 2 5 2 29
10 2019 2 1 9 2 69
11 2019 2 1 9 2 54
12 2019 2 1 9 2 94
13 2018 1 1 5 6 16
14 2018 1 1 5 6 49
15 2018 1 1 5 6 51
16 2018 2 4 2 1 61
17 2018 2 4 2 1 18
18 2018 2 4 2 1 87
我想获取具有 X 个唯一值的列 (A),并创建 X 个新列,然后使用另一列 (B) 中的值填充这些新列中的每一个。我一直在努力在搜索中阐明这个问题,但还没有找到任何东西,所以这里有一些示例数据来说明我实际尝试做的事情。
我有一个农业产量(响应变量)的数据框,来自几年的几种处理。我还有一年中不同月份(第 1、2、3 个月)的农业投入(预测变量)数据框。最终,我希望能够 运行 像 Yield ~ Input_mo1 * Input_mo2
这样的模型,所以我试图创建单独的列来显示每个月的输入(即 Input_mo1
是月份的输入年度第 1 名)。
这是我的两个输入数据框:
yield.vector <- c(95, 6, 40, 34, 61, 16, 29, 69, 77, 54, 29, 94, 16, 61, 49, 18, 51, 87)
input.vector <- c(9, 6, 7, 3, 6, 2, 2, 9, 2, 1, 5, 2, 1, 2, 6, 4, 5, 1)
data.yield <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Yield = yield.vector)
data.inputs <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Month = rep(1:3,6),
Input = input.vector)
我想创建这种合并数据框,其中每个月的输入都有产量和一列:
data.output <- data.frame(Year = c(rep(2020,6), rep(2019,6), rep(2018,6)),
Treatment = c(rep(1:2,9)),
Yield = yield.vector,
Input_mo1 = c(9,3,9,3,9,3,2,1,2,1,2,1,1,4,1,4,1,4),
Input_mo2 = c(6,6,6,6,6,6,5,9,5,9,5,9,5,2,5,2,5,2),
Input_mo3 = c(1,4,1,4,1,4,5,2,5,2,5,2,6,1,6,1,6,1))
data.output
您会注意到在输出数据框中,大部分数据是重复的,因为每年每个处理有 3 个重复,并且它们都在给定的 month_year 内接收相同的输入。输出列的名称无关紧要,只要我能区分它们并在以后重命名即可。
我花了几个小时试图弄清楚如何做到这一点,但我总是遇到死胡同。如果您能提供任何帮助,我将不胜感激。谢谢。
使用 tidyverse
您可以尝试以下操作。您可以使用 pivot_wider
将 3 个月的数据放在单独的列中。然后,您可以将两个数据框连接在一起。数据与您的 data.output
data.frame 不完全匹配 - 如果我遗漏了什么,请告诉我。
library(tidyverse)
data.inputs %>%
pivot_wider(id_cols = c(Year, Treatment),
names_from = Month,
values_from = Input,
names_prefix = "Input_mo") %>%
right_join(data.yield)
输出
Year Treatment Input_mo1 Input_mo2 Input_mo3 Yield
<dbl> <int> <dbl> <dbl> <dbl> <dbl>
1 2020 1 9 6 7 95
2 2020 1 9 6 7 40
3 2020 1 9 6 7 61
4 2020 2 3 6 2 6
5 2020 2 3 6 2 34
6 2020 2 3 6 2 16
7 2019 1 2 5 2 29
8 2019 1 2 5 2 77
9 2019 1 2 5 2 29
10 2019 2 1 9 2 69
11 2019 2 1 9 2 54
12 2019 2 1 9 2 94
13 2018 1 1 5 6 16
14 2018 1 1 5 6 49
15 2018 1 1 5 6 51
16 2018 2 4 2 1 61
17 2018 2 4 2 1 18
18 2018 2 4 2 1 87