2016-04-25 106 views
2

我有一個數據框(x),其中有一個因子變量,其值由逗號分隔。我有另一個數據框(y)與相同值的描述。現在我想用數據幀(y)中的描述替換數據幀(x)中的值。任何幫助將不勝感激。替換其他數據框中的值

比方說,這兩個數據幀看起來像下面

data frame (x) 
    s.no x 
    1  2,5,45 
    2  35,5 
    3  45 

data fram (y) 
s.no x description 
1  2  a 
2  5  b 
3  45  c 
4  35  d 

我需要的輸出如下

s.no x 
1  a,b,c 
2  d,b 
c  c 

回答

3

我們可以在「X」的數據集「split的「X」列,'循環訪問list,將值與'y'中的'x'列進行匹配以獲得數字索引,從'y'獲取相應的'description'值並將它們結合在一起。

x$x <- sapply(strsplit(x$x, ","), function(z) 
      toString(y$description[match(as.numeric(z), y$x)])) 

x 
# s.no  x 
#1 1 a, b, c 
#2 2 d, b 
#3 3  c 

注:如果在 'X' 的 'x' 列是factor類中,使用strsplit(as.character(x$x, ","))

+1

對不起,在那裏沒有看到你。因爲它非常相似,所以被刪除了。沒有人看到你......你就像一個忍者:) – Sotos

+0

@Sotos沒問題。你可以用'mgsub'或類似的東西想出另一個想法 – akrun

+0

這是從'qdap'吧? ...我無法讓這個軟件包正常工作... – Sotos

5

隨着splitstackshape

library(splitstackshape) 

cSplit(x, 'x', ',', 'long')[setDT(y), on='x'][,.(x=paste(description, collapse=',')), s.no] 

# s.no  x 
#1: 1 a,b,c 
#2: 2 b,d 
#3: 3  c 
+0

使用'splitstackshape'包時,不需要使用'setDT'。 – h3rm4n

+0

爲指出這一點,它現在是一個班輪:) –

4

使用dplyrtidyr A液:

library(dplyr) 
library(tidyr) 
x %>% 
    separate(x, paste0('x',1:3),',',convert=TRUE) %>% 
    gather(var, x, -1, na.rm=TRUE) %>% 
    left_join(., y, by='x') %>% 
    group_by(s.no = s.no.x) %>% 
    summarise(x = paste(description,collapse = ',')) 

結果:

s.no  x 
    (int) (chr) 
1  1 a,b,c 
2  2 d,b 
3  3  c 
+0

你知道你發佈的只是我的解決方案的複製粘貼嗎? –

+0

@ColonelBeauvel我發佈後沒有看到它。我刪除了'cSplit'解決方案。 – h3rm4n

+0

dplyr,+1的不錯解決方案 –

相關問題