2014-03-19 61 views
1

我有兩個data.frames看起來像這些的:匹配值與值dataframes一列

>df1 
V1 
    a 
    b 
    c 
    d 
    e 

>df2 
V1  V2 
    1 a,k,l 
    2 c,m,n 
    3 z,b,s 
    4 l,m,e 
    5 t,r,d 

我想從df2$V2df1$V1與匹配的值,並添加一個新列df1對應的匹配和的df2$V1值時,輸出的願望是:

>df1 
V1 V2 
    a 1 
    b 3 
    c 2 
    d 5 
    e 4 

我試過這種方法,但只有工作,如果df2$V2只包含一個元素:

match(as.character(df1[,1]), strsplit(as.character(df2[,2], ",")) -> idx 
df1$V2 <- df2[idx,1] 

非常感謝

+0

如果在「df2 $ V2」中多次出現「a」會怎麼樣?結果應該是什麼? – A5C1D2H2I1M1N2O1R2T1

+0

感謝評論@AnandaMahto,'df1 $ V1'中的值只會在'df2 $ V2'中出現一次,但如果有任何重複,那麼用冒號「,」分隔的兩個值將是完美的 – user2380782

回答

1

您可以只使用grep,這將返回字符串的發現位置:

sapply(df1$V1, grep, x = df2$V2) 
# a b c d e 
# 1 3 2 5 4 

如果你希望重複,您可以使用paste

讓我們修改您的數據,以便有一個重複:

df2$V2[3] <- "z,b,s,a" 

並修改相應的解決方案:

sapply(df1$V1, function(z) paste(grep(z, x = df2$V2), collapse = ";")) 
#  a  b  c  d  e 
# "1;3" "3" "2" "5" "4" 
1

這裏有一個辦法:

library(qdap) 
key <- setNames(strsplit(as.character(df2$V2), ","), df2$V1) 
df1$V2 <- as.numeric(df1$V1 %l% key) 

df1 

## V1 V2 
## 1 a 1 
## 2 b 3 
## 3 c 2 
## 4 d 5 
## 5 e 4 

首先,我們使用strsplit創建一個命名列表。然後我們使用qdap的lookup運算符%l%來匹配值並創建一個新列(我轉換爲數字,儘管這可能不是必需的)。

1

類似泰勒的回答,但在基地使用stack

df.stack <- stack(setNames(strsplit(as.character(df2$V2), ","), df2$V1)) 
transform(df1, V2=df.stack$ind[match(V1, df.stack$values)]) 

生產:

拆分過的grep
V1 V2 
1 a 1 
2 b 3 
3 c 2 
4 d 5 
5 e 4 

一個優點是使用grep運行搜索a和風險匹配諸如alabama等東西(儘管您可以小心使用模式來減輕這種影響(即包括字邊界等)

注意這隻會找到第一個匹配值。