计算R中多列的行

时间:2018-07-25 11:53:24

标签: r data.table

我刚开始学习R,并且具有如下数据表

    obj= c('A','A','A','A','A','A','A','A','A')
    x=c('Poor','Good','Good','Good','Poor','Poor','Poor','Good','Poor')
    y=c('High','Low','Low','Low','Low','Low','Low','Low','High')
    df = data.table(obj,x,y)


 df
obj    x    y
1:   A Poor High
2:   A Good  Low
3:   A Good  Low
4:   A Good  Low
5:   A Poor  Low
6:   A Poor  Low
7:   A Poor  Low
8:   A Good  Low
9:   A Poor High

对于obj列中的某行,我想从x列计算好,坏的行数,从y列计算高,低的行数。

我能够使用下面的代码对x列进行此操作。

dcast(df, obj ~ x, value.var=c("x"), fun.aggregate = length)

这给了我

 obj Good Poor
1:   A    4    5

但是我想要得到的是x和y列,如下所示。

obj Good Poor   High    Low
A   4    5       2       7

2 个答案:

答案 0 :(得分:1)

通过@DavidArenburg的评论答案,您可以...

df[, Reduce(`c`, lapply(.SD, function(x) as.list(table(x)))), by = obj]

#    obj Good Poor High Low
# 1:   A    4    5    2   7

或者...

dcast(melt(df, "obj"), 
  obj ~ paste(variable, value, sep="."), 
  fun.aggregate = length)

#    obj x.Good x.Poor y.High y.Low
# 1:   A      4      5      2     7

或者...

melt(df, "obj")[, .N, keyby=.(obj, variable, value)]

#    obj variable value N
# 1:   A        x  Good 4
# 2:   A        x  Poor 5
# 3:   A        y  High 2
# 4:   A        y   Low 7

由于可以访问变量和值,因此后一种方法最好用于以后的分析。

答案 1 :(得分:0)

我肯定会引起这里data.table个人的愤怒,但这是tidyverse解决方案的帮助对象,

df %>%
 rowid_to_column() %>%
 mutate(value = 1,
        value_1 = 1) %>%
 spread(key = x, value = value) %>%
 spread(key = y, value = value_1) %>%
 select(-rowid) %>%
 mutate_at(vars(Good:Low), funs(if_else(is.na(.), 0, .))) %>%
 group_by(obj) %>%
 summarize_all(funs(sum))