R专家在努力解决tidyr,重塑,散布等问题,解决了几个小时后,我将非常感谢R专家的帮助。
对于具有不同组和分配值的数据框,是否有一种方法可以转换和转置数据框,以便将每个组分配给一个新列,并将所有分配值都列在该组下?
以下是数据框的一些示例代码:
a <- c("Group1", "Group1", "Group1", "Group2", "Group2", "Group2", "Group2", "Group2", "Group3")
b <- c("Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7", "Item8", "Item9")
使用这两列,为每个组创建一个新列。
下面,我将手动显示此内容,但需要R才能自动执行下一步。
我手动添加了“-”,以避免出现错误“ data.frame中的错误:参数暗示行数不同”。实际上,我不能为每个组添加“-”。
Group1 <- c("Item1", "Item2", "Item3", "--", "--")
Group2 <- c("Item4", "Item5", "Item6", "Item7", "Item8")
Group3 <- c("Item9", "--", "--", "--", "--")
下面是我要创建的输出。
table <- data.frame(Group1, Group2, Group3)
挑战在于变量必须是动态的。对于不同的数据集,组的数量和项目的数量将发生变化,并且我无法手动为每个组中的空格手动“-”。
这个问题类似于这个问题,除了我的问题涉及动态范围。 Convert data frame common rows to columns
答案 0 :(得分:3)
我们可以使用tidyr::spread
library(tidyverse)
df %>% group_by(a) %>% mutate(n = 1:n()) %>% spread(a, b) %>% select(-n)
## A tibble: 5 x 3
# Group1 Group2 Group3
# <fct> <fct> <fct>
#1 Item1 Item4 Item9
#2 Item2 Item5 NA
#3 Item3 Item6 NA
#4 NA Item7 NA
#5 NA Item8 NA
或者,如果您更喜欢"--"
而不是NA
,则可以这样做(感谢@AntoniosK)
df %>%
group_by(a) %>%
mutate(n = 1:n()) %>%
spread(a, b) %>%
select(-n) %>%
mutate_all(~ifelse(is.na(.), "--", as.character(.)))
## A tibble: 5 x 3
# Group1 Group2 Group3
# <chr> <chr> <chr>
#1 Item1 Item4 Item9
#2 Item2 Item5 --
#3 Item3 Item6 --
#4 -- Item7 --
#5 -- Item8 --
或使用tidyr::spread
的{{1}}参数
fill
给出相同的结果。
df %>%
mutate_if(is.factor, as.character) %>%
group_by(a) %>%
mutate(n = 1:n()) %>%
spread(a, b, fill = "--") %>%
select(-n)