首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于逗号聚合列

基于逗号聚合列
EN

Stack Overflow用户
提问于 2018-07-02 21:41:26
回答 5查看 49关注 0票数 2

我有以下数据框架,我正在尝试分隔逗号,并将该特定名称转换为它们自己的单独列,并指定该特定ID的特定列名是否存在(以逗号分隔)。(1 =是,0=否)任何帮助都将不胜感激!谢谢!

代码语言:javascript
复制
ID<- c(1,2,3,4,5,6)
Details<- c("V1,V2", "V1,V3", "V1", "V2", "V3,V4", "V2,V3" )

data.frame <- data.frame(ID, Details, stringsAsFactors=FALSE)

所需输出:

代码语言:javascript
复制
ID<-c(1,2,3,4,5,6)
V1<-c(1,1,1,0,0,0)
V2<-c(1,0,0,1,0,1)
V3<-c(0,1,0,0,1,1)
V4<-c(0,0,0,0,1,0)

data.frame1<-data.frame(ID, V1, V2, V3, V4, stringsAsFactors=FALSE)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-03 07:17:43

我看到的最直接的方法是为隐藏在字符串中的每个向量构建一个data.frame并绑定它们。purrr可以帮助使其非常紧凑。请注意,不需要使用ID列,我将直接使用Details

代码语言:javascript
复制
library(purrr)
df <- map_dfr(strsplit(Details, ","),
              ~data.frame(t(setNames(rep(1, length(.x)), .x))))
df[is.na(df)] <- 0

#   V1 V2 V3 V4
# 1  1  1  0  0
# 2  1  0  1  0
# 3  1  0  0  0
# 4  0  1  0  0
# 5  0  0  1  1
# 6  0  1  1  0

您还可以拆分和取消列表,以获得不同的值,然后在原始向量中查找它们:

代码语言:javascript
复制
unique_v <- unique(unlist(strsplit(Details, ",")))
map_dfc(unique_v, ~as.numeric(grepl(.x, Details)))
# # A tibble: 6 x 4
#      V1    V2    V3    V4
#   <dbl> <dbl> <dbl> <dbl>
# 1     1     1     0     0
# 2     1     0     1     0
# 3     1     0     0     0
# 4     0     1     0     0
# 5     0     0     1     1
# 6     0     1     1     0

如果你知道列数,我们也可以做一些脏字符串的评估:

代码语言:javascript
复制
m <- as.data.frame(matrix(0,ncol=4,nrow=6))
eval(parse(text=paste0("m[",ID,", c(",gsub("V","",Details),")] <- 1")))
#   V1 V2 V3 V4
# 1  1  1  0  0
# 2  1  0  1  0
# 3  1  0  0  0
# 4  0  1  0  0
# 5  0  0  1  1
# 6  0  1  1  0
票数 0
EN

Stack Overflow用户

发布于 2018-07-02 21:46:13

使用tidyverse包的解决方案。dat是您的示例数据帧。dat2是最终的数据帧。

代码语言:javascript
复制
library(tidyverse)

dat2 <- dat %>%
  separate_rows(Details) %>%
  mutate(Value = 1L) %>%
  spread(Details, Value, fill = 0L)
dat2
#   ID V1 V2 V3 V4
# 1  1  1  1  0  0
# 2  2  1  0  1  0
# 3  3  1  0  0  0
# 4  4  0  1  0  0
# 5  5  0  0  1  1
# 6  6  0  1  1  0
票数 3
EN

Stack Overflow用户

发布于 2018-07-02 21:49:00

来自qdapToolsmtabulate的一个选项

代码语言:javascript
复制
library(qdapTools)
cbind.data.frame(ID, # or data.frame$ID
                 mtabulate(strsplit(as.character(data.frame$Details), ",")))
# output
  ID V1 V2 V3 V4
1  1  1  1  0  0
2  2  1  0  1  0
3  3  1  0  0  0
4  4  0  1  0  0
5  5  0  0  1  1
6  6  0  1  1  0
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51137612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档