我有以下結構的數據幀:轉換成列排不指定列名
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,role.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
謝謝!
@Frank我不知道如何解釋這句話。但是,我們需要至少指定列測量列。在可以完成的'merged.stack'中。 – akrun
我的意思是說你寫的是「participant.1」「participant.2」......這樣做似乎違反了OP的前提,即避免枚舉列(像分裂堆棧解決方案那樣),因爲參與者不會提前知道(或類似的東西)。 – Frank
使用'grep' ..... – Arun