将数据帧转换为另一种形式

时间:2015-05-16 04:43:36

标签: r

我是[r]的新人。最近,我陷入了如何在data.frame中执行操作的问题。 现在我有一个名为frame的data.frame。我想把它转换成另一种形式。

> frame
         A      B  Freq total
1        0      0   75   110
2        1      0   21   110
3        0      1    8   110
4        1      1    6   110

预期的形式是:

> frame(B=1)
         A    Freq total
1        0      8   83
2        1      6   27

有人能提出一些建议吗?感谢

2 个答案:

答案 0 :(得分:2)

一种选择是使用dplyr。我们按' A'分组,然后创建一个新列' total'作为" Freq"的sumfilter' B' = 1,select除了' B'

之外的所有其他列
library(dplyr)
frame %>% 
     group_by(A) %>% 
     mutate(total= sum(Freq)) %>%
     filter(B==1)%>%
     select(-B)
#  A Freq total
#1 0    8    83
#2 1    6    27

或者使用data.table,我们将data.frame转换为data.tablesetDT(frame)或我们可以as.data.table(frame)),创建新列{{1} }作为' Freq'的total,按' A'分组,将B = 1的行子集,并删除' B'列分配为NULL。

sum

或者使用library(data.table) setDT(frame)[, total:= sum(Freq), A][B==1][,B:=NULL] # A Freq total #1: 0 8 83 #2: 1 6 27 ,我们会创建'总计'使用base R然后使用transform/ave使用的行为' B'。

subset

答案 1 :(得分:0)

以下是使用基础包中的函数的示例 - aggregate()merge()

frame <- read.table(header = T, text = "
A      B  Freq total
1        0      0   75   110
2        1      0   21   110
3        0      1    8   110
4        1      1    6   110")

# obtain sum by column A
frame1 <- aggregate(frame$Freq, by = list(frame$A), sum)
names(frame1) <- c("A", "total")

# merge Freq
frame2 <- merge(frame1, frame[frame$B == 1, c(1,3)], by="A")
#  A total Freq
#1 0    83    8
#2 1    27    6