我刚开始学习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
答案 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))