2014-04-22 78 views
2

(請隨時自由調整標題的東西更恰當)在第Y列重複的行每行的列X長度

我有一個data.frame兩列,Xlist類的Y如下

X <- list("A","B","C","D") 
Y <- list("a",c("a", "b"),"c",c("a", "c", "d")) 

df <- as.data.frame(cbind(X,Y)) 

當塔Y具有兩個或多個條目或者作爲這裏字符,我想爲每行的Y(字符數)的長度以對應於相同的行數在X柱。易於放置,對於Y中的每個字符,它們必須是X中的單個行。

# desired output 

X Y 
A a 
B a 
B b 
C c 
D a 
D c 
D d 

我不知道該怎麼做,所以任何指針,將不勝感激,謝謝!

+0

不要在X元素曾經有多個項目?你實際處理了多少列? – A5C1D2H2I1M1N2O1R2T1

回答

3

嘗試

do.call(rbind, Map(expand.grid, X, Y)) 
## Var1 Var2 
## 1 A a 
## 2 B a 
## 3 B b 
## 4 C c 
## 5 D a 
## 6 D c 
## 7 D d 
+0

乾杯!正是我需要的! –

1

這裏有一個選擇:

library(data.table) 
DT <- as.data.table(df) 
DT[, list(Y = unlist(Y)), by = unlist(X)] 
# unlist Y 
# 1:  A a 
# 2:  B a 
# 3:  B b 
# 4:  C c 
# 5:  D a 
# 6:  D c 
# 7:  D d 

這將是比Map + expand.grid方法快得多,即使你只處理,比如說,1000行;然而,如果「X」的每個「行」只有一個元素,這將僅以其現在的形式工作。


這裏是一個應該能夠在超過一列一個以上的元素來處理列表的功能,而且應該很容易處理超過兩列。

egFun <- function(indf) { 
    DT <- data.table(indf, keep.rownames=TRUE, key = "rn") 
    out <- Reduce(function(x, y) x[y, allow.cartesian = TRUE], 
     lapply(setdiff(names(DT), "rn"), function(x) 
      DT[, list(unlist(get(x))), by = rn])) 
    setnames(out, names(DT)) 
    out 
} 

用法是:

egFun(df) 
相關問題