将具有 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