将 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
下图是数据集的表示。我尝试使用 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