我是[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
有人能提出一些建议吗?感谢
答案 0 :(得分:2)
一种选择是使用dplyr
。我们按' A'分组,然后创建一个新列' total'作为" Freq"的sum
,filter
' 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.table
(setDT(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