【发布时间】:2015-07-31 10:58:39
【问题描述】:
我有一个具有以下结构的数据框:
bad_df <- data.frame(
id = c("id001", "id002", "id003"),
participant.1 = c("Jana", "Marina", "Vasilei"),
participant.2 = c("Niko", "Micha", "Niko"),
role.1 = c("writer", "writer", "speaker"),
role.2 = c("observer", "observer", "observer"),
stringsAsFactors = F
)
bad_df
我需要把它收集成这样的东西。每行应包含一个 id、参与者和角色。
good_df <- data.frame(
id = c("id001", "id001", "id002", "id002", "id003", "id003"),
participant = c("Jana", "Niko", "Marina", "Micha", "Vasilei", "Niko"),
role = c("writer", "observer", "writer", "observer", "speaker", "observer"),
stringsAsFactors = F
)
good_df
我看到有无数类似的问题,但我很难理解如何将tidyr 或reshape2 应用于这种情况。我知道这必须通过收集()以某种方式实现。
但是,数据框可能包含更多的参与者和相应的角色,因此理想情况下,该方法不需要指定列名。我想出的一种解决方案如下,但我认为这不是最优雅的方法。而且我仍然需要处理一些包含参与者.3、角色.3 等的数据帧。
good_df2 <- rbind(bad_df %>% select(id, participant.1, role.1) %>%
rename(participant = participant.1, role = role.1),
bad_df %>% select(id, participant.2, role.2) %>%
rename(participant = participant.2, role = role.2))
good_df2
谢谢!
【问题讨论】: