2

次のように、グループと2つの値列で構成されるデータフレームがあります。

group  val1  val2
    A     5     3
    A     2     4
    A     3     1
    B     3     6
    B     2     1
    B     0     2

サブセットで分割された val1 > val2 の行数を計算したいと思います。最初に、サブグループごとにこれを次のようにハードコーディングしました。

number_a <- nrow(subset(df, group=="A" & val1 > val2))
number_b <- nrow(subset(df, group=="B" & val1 > val2))

これを自動化する適切な方法は何ですか?関数を使用してみましたが、列と列split()の両方を渡す方法がわかりませんでした。val1val2

4

3 に答える 3

3

使用してかなり簡単data.table

行数が欲しい場合

library(data.table)
setDT(df)[, .(RowsNum = sum(val1 > val2)), by = group]
#    group RowsNum
# 1:     A       2
# 2:     B       1

を探している場合は、ベース Rsplitapply組み合わせも試すことができます

sapply(split(df[-1], df[1]), function(x) sum(x[1] > x[2]))
# A B 
# 2 1 

またはtapply(ベースRからも)を使用して

tapply(with(df, val1 > val2), df[1], sum)
# group
# A B 
# 2 1 

行自体が必要な場合

setDT(df)[, .SD[val1 > val2]]
#    group val1 val2
# 1:     A    5    3
# 2:     A    3    1
# 3:     B    2    1

または、ベースRでも非常に単純です

df[with(df, val1 > val2), ]
#    group val1 val2
# 1     A    5    3
# 3     A    3    1
# 5     B    2    1

または

subset(df, val1 > val2)
#   group val1 val2
# 1     A    5    3
# 3     A    3    1
# 5     B    2    1
于 2014-12-04T11:02:03.250 に答える
2

を使用した別のオプションdplyr

 library(dplyr)
 filter(df, val1 >val2)
 #   group val1 val2
 #1     A    5    3
 #2     A    3    1
 #3     B    2    1

必要な場合はnrows

 df %>%
    group_by(group) %>% 
    filter(val1 >val2) %>%
    summarise(RowsNum=n())
  #   group RowsNum
  #1     A       2
  #2     B       1

またはから使用aggregateするbase R

aggregate(cbind(RowsNum = val1 > val2) ~ group, df, sum)
#  group RowsNum
#1     A       2
#2     B       1
于 2014-12-04T11:02:42.547 に答える