我有这个数据框:
x <- data.frame(
name = rep(letters[1:4], each = 2),
condition = rep(c("A", "B"), times = 4),
value = c(2,10,4,20,8,40,20,100)
)
# name condition value
# 1 a A 2
# 2 a B 10
# 3 b A 4
# 4 b B 20
# 5 c A 8
# 6 c B 40
# 7 d A 20
# 8 d B 100
我想按名称进行分组,并将condition == "B"
行的值除以condition == "A"
的行,以获得此结果:
data.frame(
name = letters[1:4],
value = c(5,5,5,5)
)
# name value
# 1 a 5
# 2 b 5
# 3 c 5
# 4 d 5
我知道这样的事情可以让我非常接近:
x$value[which(x$condition == "B")]/x$value[which(x$condition == "A")]
但我想知道是否有一种简单的方法可以使用dplyr(我的数据框是一个玩具示例,我通过链接多个group_by
和summarise
调用来实现此目的。)
答案 0 :(得分:10)
尝试:
x %>%
group_by(name) %>%
summarise(value = value[condition == "B"] / value[condition == "A"])
给出了:
#Source: local data frame [4 x 2]
#
# name value
# (fctr) (dbl)
#1 a 5
#2 b 5
#3 c 5
#4 d 5
答案 1 :(得分:5)
我使用spread
中的tidyr
。
library(dplyr)
library(tidyr)
x %>%
spread(condition, value) %>%
mutate(value = B/A)
name A B value
1 a 2 10 5
2 b 4 20 5
3 c 8 40 5
4 d 20 100 5
然后,您可以select(-A, -B)
删除额外的列。
答案 2 :(得分:2)
使用data.table
,转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(x)
),按姓名&#39;分组,我们将&#39;值除以&#39;对应于&#39; B&#39;条件由那些对应于&#39; A&#39; &#39;条件&#39;
library(data.table)
setDT(x)[,.(value = value[condition=="B"]/value[condition=="A"]) , name]
# name value
#1: a 5
#2: b 5
#3: c 5
#4: d 5
或重塑长期&#39;广泛的&#39;并划分&#39; B&#39;专栏&#39; A&#39;。
dcast(setDT(x), name~condition, value.var='value')[, .(name, value = B/A)]