从数据框中聚合多个列

3

我有一个数据框,其中某些行的元素中用逗号连接了一堆数据。类似这样:

df <- data.frame(
c(2012,2012,2012,2013,2013,2013,2014,2014,2014)
,c("a,b,c","d,e,f","a,c,d,c","a,a,a","b","c,a,d","g","a,b,e","g,h,i")
)
 names(df) <- c("year", "type")

我希望能够以 dcast 接近的形式得到它,年份、a、b、c等应成为列,数据框中的频率应在结果数据框的单元格中。我首先尝试在 df 上使用 colsplit,然后再使用 dcast,但似乎只有在想要对其中一个级别进行聚合时才起作用。
 df2 <- data.frame( df$year,  colsplit(df$type, ',' , c('v1','v2','v3','v4','v5')) )
 df3 <- dcast(df2, df.year ~ v1)

这个结果只针对colsplit的第一级,而不是所有级别。我离解决方案近了吗?还是应该采用完全不同的方法?
4个回答

3

这里有一种使用base R的单行选项,通过使用strsplit拆分“type”列,然后将list输出的名称设置为“year”,并将其堆叠到一个单独的数据框中,最后使用table获取频率计数。

table(stack(setNames(strsplit(as.character(df$type), ","), df$year))[2:1])
#        values
#ind    a b c d e f g h i
#  2012 2 1 3 2 1 1 0 0 0
#  2013 4 1 1 1 0 0 0 0 0
#  2014 1 1 0 0 1 0 2 1 1

1
你已经接近解决方案了。你只需要再走一步。在使用 dcast 之前,你需要将一个列中的所有值 melt。请参考下面的示例。
require(reshape2)

df <- data.frame(c(2012,2012,2012,2013,2013,2013,2014,2014,2014),
                 c("a,b,c","d,e,f","a,c,d,c","a,a,a","b","c,a,d","g","a,b,e","g,h,i"))
names(df) <- c("year", "type")
df

df2 <- data.frame(df$year, colsplit(df$type, ',', c('v1','v2','v3','v4','v5')))
df2

df3 <- melt(df2, id.vars = "df.year", na.rm = T)
df3

df4 <- dcast(df3[df3$value != "", ], df.year ~ value, fun.aggregate = length)
df4

1
这是一个 data.table 的方法:
library(data.table)
setDT(df)
dcast(df[, .(unlist(strsplit(as.character(type), ",", fixed=TRUE))), by = year], 
 year ~ V1, value.var = "V1", fun.aggregate = length)
#   year a b c d e f g h i
#1: 2012 2 1 3 2 1 1 0 0 0
#2: 2013 4 1 1 1 0 0 0 0 0
#3: 2014 1 1 0 0 1 0 2 1 1

我们首先按逗号和年龄组将类型列拆分为长格式,然后使用dcast函数以length为聚合函数转换为宽格式。

0

也许,类似这样的东西可以行得通吗?

# extract unique values and years
    vals <- unique(do.call(c, strsplit(x = as.vector(df$type), "[[:punct:]]")))
    years <- unique(df$year)

# count
    df4 <- data.frame(sapply(vals, (function(vl) {sapply(years, (function(ye){ 
      sum(do.call(c, strsplit(as.vector(df$type[df$year == ye]) , "[[:punct:]]")) == vl)
    }))})))
    df4 <- cbind(years, df4)
    df4
#result
  years a b c d e f g h i
1  2012 2 1 3 2 1 1 0 0 0
2  2013 4 1 1 1 0 0 0 0 0
3  2014 1 1 0 0 1 0 2 1 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接