2016-05-25 3 views
4

私はこのデータフレームを持っている:dplyrを使用して行のグループを分割する方法は?

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 == "A"持つものでcondition == "B"持つ行の値を分割:私はこの缶のようなものを知っている

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でこれを行う簡単な方法があった場合、私は思っていた(私のDAT aframeはおもちゃの例で、私は複数のgroup_bysummariseの呼び出しを連鎖させることでそれを得ました。

答えて

8

試してみてください。

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 
5

を私はtidyrからspreadを使用すると思います。

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

data.tableを使用して、 'data.frame'を 'name'でグループ化された 'data.table'(setDT(x))に変換し、 '値'を 'B'条件に 'A' ' '調子'。

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 

「長い」から「広い」に変更し、「B」の列を「A」で割ります。

dcast(setDT(x), name~condition, value.var='value')[, .(name, value = B/A)] 
関連する問題