将 tibble 扩展为行并使用 R 基于行创建新列

Wide the tibble into row and creating new columns based on row using R

下图是数据集的表示。我尝试使用 reshape 和 pivot_wider 来扩大数据,但无法以我预期的方式获得结果。 我尝试了Merging multiple rows into single row从堆栈溢出但发现解决方案是错误的

下图是我希望从数据集中得到的预期结果。

随机数据集生成代码

df1 <- data.frame(Components = c(rep("ABC",5),rep("BCD",5)), 
              Size = c(sample(1:100,5),sample(45:100,5)),
              Age = c(sample(1:100,5),sample(45:100,5)))

试试这个 tidyverse 解决方案,它将产生接近您想要的输出。您可以按 Components 分组,然后创建一个顺序 ID 来标识未来的列。之后 reshape 为 long (pivot_longer()) 将变量名与 id 组合,然后 reshape 为 wide (pivot_wider())。这是我使用您共享的数据的代码:

library(tidyverse)
#Code
newdf <- df1 %>% group_by(Components) %>% mutate(id=row_number()) %>%
  pivot_longer(-c(Components,id)) %>%
  mutate(name=paste0(name,'.',id)) %>% select(-id) %>%
  pivot_wider(names_from = name,values_from=value)

输出:

# A tibble: 2 x 11
# Groups:   Components [2]
  Components Size.1 Age.1 Size.2 Age.2 Size.3 Age.3 Size.4 Age.4 Size.5 Age.5
  <fct>       <int> <int>  <int> <int>  <int> <int>  <int> <int>  <int> <int>
1 ABC            23    94     52    89     15    25     76    38     33    99
2 BCD            59    62     55    81     81    61     80    83     97    68

我们可以使用 unite 来合并列,然后使用 pivot_wider

library(dplyr)
library(tidyr)
library(data.table)
df1 %>%
   mutate(rn = rowid(Components)) %>%
   pivot_longer(cols = Size:Age) %>% 
   unite(name, name, rn, sep=".") %>%
   pivot_wider(names_from = name, values_from = value)

-输出

# A tibble: 2 x 11
#  Components Size.1 Age.1 Size.2 Age.2 Size.3 Age.3 Size.4 Age.4 Size.5 Age.5
#  <chr>       <int> <int>  <int> <int>  <int> <int>  <int> <int>  <int> <int>
#1 ABC            11    16     79    57     70     2     80     6     91    24
#2 BCD            67    81     63    77     48    73     52   100     49    76