根据逗号汇总列

时间:2018-07-02 13:41:26

标签: r dataframe aggregation analysis

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

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)

期望的输出:

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)

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

来自element = document.getElementById('inputID') element.value = "aNewValue"; var ev = new Event('change', { view: window, bubbles: true, cancelable: true, }); element.dispatchEvent(ev); document.getElementById('buttonID').click(); 的{​​{1}}的一个选项

mtabulate

答案 2 :(得分:1)

这是基本的R解决方案。我已将您的data.frames data1data2重命名。

data1 <- data.frame(ID, Details, stringsAsFactors=FALSE)
data2 <- data.frame(ID, V1, V2, V3, V4, stringsAsFactors=FALSE)        

nms <- unique(unlist(strsplit(data1$Details, ",")))
data3 <- cbind.data.frame(ID, sapply(nms, grepl, data1$Details))
data3[-1] <- lapply(data3[-1], as.integer)

现在将data3与您的预期结果data2进行比较。

all.equal(data2, data3)
#[1] TRUE

但是请注意

identical(data2, data3)
#[1] FALSE

这是因为我使用了as.integer,并且data2中的值属于"numeric"类。如果这有所作为,则可以将上面的lapply指令更改为使用as.numeric

答案 3 :(得分:0)

使用基数R:

 xtabs(val~.,cbind.data.frame(ID=rep(ID,lengths(s<-strsplit(Details,","))),Details=unlist(s),val=1))
   Details
ID  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

答案 4 :(得分:0)

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

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

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

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

如果您知道列数,我们也可以进行一些脏字符串评估:

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