我有一個數據幀,看起來像這樣(我簡化):把多行的組合矩陣在數據幀的一列,然後把它分解
df <- data.frame(rbind(c(1, "dog", "cat", "rabbit"), c(2, "apple", "peach", "cucumber")))
colnames(df) <- c("ID", "V1", "V2", "V3")
## ID V1 V2 V3
## 1 1 dog cat rabbit
## 2 2 apple peach cucumber
我想創建一個包含所有可能的列變量V1:V3兩個組合(順序無關緊要),但保持與原始ID的鏈接。所以像這樣的東西。
## ID bigrams
## 1 1 dog cat
## 2 1 cat rabbit
## 3 1 dog rabbit
## 4 2 apple peach
## 5 2 apple cucumber
## 6 2 peach cucumber
我的想法:用combn()
,mutate()
和separate_row()
。
library(tidyr)
library(dplyr)
df %>%
mutate(bigrams=paste(unlist(t(combn(df[,2:4],2))), collapse="-")) %>%
separate_rows(bigrams, sep="-") %>%
select(ID,bigrams)
結果不出我所料...我猜認爲連接矩陣(的combine()
結果)不是這麼簡單。
我對此有兩個問題:1)如何調試這段代碼? 2)這是做這種事情的好方法嗎?我是R新手,但我有一個Open Refine背景,所以連接分割的多值單元對我來說很有意義。但是這也是R的正確方法嗎?
在此先感謝您的幫助。
窩! 0_0我知道data.table是一個強大的軟件包,但對我來說總是顯得很複雜,尤其是對於大型數據框而言。我會試着去理解這兩行。非常感謝,@Akrun!我會稍微等一下,但我不明白如何縮短它。 –
在翻譯中的翻譯將是:'df%>%gather(「variable」,「value」,-ID)%>%group_by(ID)%> transmute(bigrams = combn(value,2,paste,collapse = 「」))%>%ungroup()'。這裏沒有附加值,所以我不會將它作爲單獨的答案 –
謝謝,Aurèle!就目前而言,我感覺更加舒適。 –