R - 使用和的dcast组合循环数据表

时间:2017-07-12 15:01:19

标签: r

我有一个类似的表,有更多列。我要做的是创建一个新表,为每个ID显示每个类型的计数数,每个类型的值。

DF

ID   Type  Counts  Value
1     A     1       5
1     B     2       4
2     A     2       1
2     A     3       4
2     B     1       3
2     B     2       3

我可以使用

对一个列进行此操作
dcast(df[,j=list(sum(Counts,na.rm = TRUE)),by = c("ID","Type")],ID ~ paste(Type,"Counts",sep="_"))

但是,我想在数据表中使用每个列的循环。但没有成功,它总是会加起来所有的行。我试着用

sum(df[[i]],na.rm = TRUE)
sum(names(df)[[i]] == "",na.rm = TRUE)
sum(df[[names(df)[i]]],na.rm = TRUE)
j = list(apply(df[,c(3:4),with=FALSE],2,function(x) sum(x,na.rm = TRUE)

我希望有一个类似

的新表
ID   A_Counts  B_Counts  A_Value   B_Value
1         1      2          5           4
2         5      3          5           6 

我自己的表有更多列,但想法是一样的。我是否过度复杂或是否有一个我不知道的简单技巧?请帮我。谢谢!

1 个答案:

答案 0 :(得分:2)

您必须先melt您的数据,然后dcast

library(reshape2)
df2 <- melt(df,id.vars = c("ID","Type"))
#    ID Type variable value
# 1   1    A   Counts     1
# 2   1    B   Counts     2
# 3   2    A   Counts     2
# 4   2    A   Counts     3
# 5   2    B   Counts     1
# 6   2    B   Counts     2
# 7   1    A    Value     5
# 8   1    B    Value     4
# 9   2    A    Value     1
# 10  2    A    Value     4
# 11  2    B    Value     3
# 12  2    B    Value     3
dcast(df2,ID ~ Type + variable,fun.aggregate=sum)

#   ID A_Counts A_Value B_Counts B_Value
# 1  1        1       5        2       4
# 2  2        5       5        3       6

仅具有基本功能的另一种解决方案:

df3 <- aggregate(cbind(Counts,Value) ~ ID + Type,df,sum)
#   ID Type Counts Value
# 1  1    A      1     5
# 2  2    A      5     5
# 3  1    B      2     4
# 4  2    B      3     6

reshape(df3, idvar='ID', timevar='Type',direction="wide")
#   ID Counts.A Value.A Counts.B Value.B
# 1  1        1       5        2       4
# 2  2        5       5        3       6

数据

df <- read.table(text ="ID   Type  Counts  Value
1     A     1       5
1     B     2       4
2     A     2       1
2     A     3       4
2     B     1       3
2     B     2       3",stringsAsFactors=FALSE,header=TRUE)