将数据帧中单元格中的多个元素映射到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
,因为键值对已经在两列中。谢谢你指出这一点