2016-04-25 108 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的不错解决方案 –

相关问题