将数据帧中单元格中的多个元素映射到R中的另一个数据帧

将数据帧中单元格中的多个元素映射到R中的另一个数据帧,r,R,我有一个只有一列的表: df <- data.frame(Interest = c("a,b,c,d,e","a,b,d","e,c,b","d,f")) Interest ---- a,b,c,d,e a,b,d e,c,b d,f df我不确定您为什么需要这种输出格式,但这段代码将提供您想要的 library(tidyr) library(dplyr) df$Id=1:dim(df)[1] df=df %>% transform(input = st

我有一个只有一列的表:

df <- data.frame(Interest = c("a,b,c,d,e","a,b,d","e,c,b","d,f"))

Interest  
----
a,b,c,d,e  
a,b,d  
e,c,b  
d,f

df我不确定您为什么需要这种输出格式,但这段代码将提供您想要的

library(tidyr)
library(dplyr)

df$Id=1:dim(df)[1]
df=df %>%
    transform(input = strsplit(input, ",")) %>%
    unnest(input)
df=merge(df,map,by.x='input',by.y='key',all.x=T)
df%>%group_by(Id)%>%dplyr::summarise(Interest=paste(input,collapse = ","),Mapped=paste(value,collapse = ","))

# A tibble: 4 × 3
     Id  Interest    Mapped
  <chr>     <chr>     <chr>
1     1 a,b,c,d,e 1,2,3,4,5
2     2     a,b,d     1,2,4
3     3     b,c,e     2,3,5
4     4       d,f       4,6
library(tidyr)
图书馆(dplyr)
df$Id=1:dim(df)[1]
df=df%>%
转换(输入=strsplit(输入,“,”))%>%
unnest(输入)
df=merge(df,map,by.x='input',by.y='key',all.x=T)
df%%>%group_by(Id)%%>%dplyr::summary(兴趣=粘贴(输入,折叠=“,”),映射=粘贴(值,折叠=“,”)
#一个tibble:4×3
Id兴趣映射
1 a,b,c,d,e 1,2,3,4,5
2 a,b,d 1,2,4
3 b,c,e 2,3,5
4d,f4,6

我不确定您为什么需要此输出格式,但此代码将提供您所需的内容

library(tidyr)
library(dplyr)

df$Id=1:dim(df)[1]
df=df %>%
    transform(input = strsplit(input, ",")) %>%
    unnest(input)
df=merge(df,map,by.x='input',by.y='key',all.x=T)
df%>%group_by(Id)%>%dplyr::summarise(Interest=paste(input,collapse = ","),Mapped=paste(value,collapse = ","))

# A tibble: 4 × 3
     Id  Interest    Mapped
  <chr>     <chr>     <chr>
1     1 a,b,c,d,e 1,2,3,4,5
2     2     a,b,d     1,2,4
3     3     b,c,e     2,3,5
4     4       d,f       4,6
library(tidyr)
图书馆(dplyr)
df$Id=1:dim(df)[1]
df=df%>%
转换(输入=strsplit(输入,“,”))%>%
unnest(输入)
df=merge(df,map,by.x='input',by.y='key',all.x=T)
df%%>%group_by(Id)%%>%dplyr::summary(兴趣=粘贴(输入,折叠=“,”),映射=粘贴(值,折叠=“,”)
#一个tibble:4×3
Id兴趣映射
1 a,b,c,d,e 1,2,3,4,5
2 a,b,d 1,2,4
3 b,c,e 2,3,5
4d,f4,6

我的数据集较小,因为我很懒:

interest = data.frame(interest = c('a,b,c', 'a,c'))
keyvalue = data.frame(kv = c('a|1', 'b|2', 'c|3'))
可以使用
qdap::mgsub
。做一些“繁重的工作”

具体地说,我们使用键-值对,并使用tidyr的separate创建一个两列data.frame。然后使用
qdap::mgsub
来gsub模式和替换的向量

library(dplyr)
library(tidyr)
keyv <- keyvalue %>% separate(kv, into = c('Interest', 'Value'), sep = '\\|')
library(qdap)
interest$interest <- paste0(interest$interest,
                            '|',
                            mgsub(keyv$Interest, keyv$Value, interest$interest))

我的数据集较小,因为我懒惰:

interest = data.frame(interest = c('a,b,c', 'a,c'))
keyvalue = data.frame(kv = c('a|1', 'b|2', 'c|3'))
可以使用
qdap::mgsub
。做一些“繁重的工作”

具体地说,我们使用键-值对,并使用tidyr的separate创建一个两列data.frame。然后使用
qdap::mgsub
来gsub模式和替换的向量

library(dplyr)
library(tidyr)
keyv <- keyvalue %>% separate(kv, into = c('Interest', 'Value'), sep = '\\|')
library(qdap)
interest$interest <- paste0(interest$interest,
                            '|',
                            mgsub(keyv$Interest, keyv$Value, interest$interest))

一个简单的
strsplit
sapply
应该可以:

df$Mapped <- sapply(strsplit(as.character(df$Interest), split = ","), 
                    function(x) paste0(df1[match(x, df1$Key), "Value"], collapse = ","))

df
#   Interest    Mapped
#1 a,b,c,d,e 1,2,3,4,5
#2     a,b,d     1,2,4
#3     e,c,b     5,3,2
#4       d,f       4,6

df$Mapped一个简单的
strsplit
sapply
应该可以:

df$Mapped <- sapply(strsplit(as.character(df$Interest), split = ","), 
                    function(x) paste0(df1[match(x, df1$Key), "Value"], collapse = ","))

df
#   Interest    Mapped
#1 a,b,c,d,e 1,2,3,4,5
#2     a,b,d     1,2,4
#3     e,c,b     5,3,2
#4       d,f       4,6

df$Mapped请使用
dput
的输出或以代码而不是当前格式将数据发布到您的问题中。目前很难访问,如果没有它,我们无法真正了解真正的底层结构。请使用
dput
的输出或以代码而不是当前格式将数据发布到您的问题中。目前很难访问,如果没有它,我们真的不知道真正的底层结构。我喜欢你的答案~但我只是修改了输入数据类型~看起来输入数据不再需要使用
tidyr::separate
,因为键值对已经在两列中。感谢您指出我喜欢您的答案~但是我刚刚修改了输入数据类型~看起来输入数据不再需要使用
tidyr::separate
,因为键值对已经在两列中。谢谢你指出这一点