已编辑
我有一个 data.frame,我想按某些列分组(就在下面y
),在每个组中选择不同的行(w.r.t.y
和z
下面),然后添加一个指定每组列数的新列。然后取消分组以返回到 data.frame,包括新列。
例:
df <- data.frame(x=c(1,2,3,4),y=c(10,10,10,20),z=c(100,100,101,200))
x y z
1 10 100
2 10 100
3 10 101
4 20 200
我想接收数据帧:
x y z n
1 10 100 2
3 10 101 2
4 20 200 1
前两行具有n=2
,因为两者都具有相同的y
但不同的z
值。
我想你可以在data.table中作为替代方案
library(data.table)
setDT(df)
df[,.(n := .GPR ), y]
但我想你想要的结果可以通过以下方式收到
df[,.(n := .GPR ), .(y,z)]
在这种情况下,您可以将以下内容与dplyr
一起使用:
df %>% distinct(y,z,.keep_all=TRUE) %>% add_count(y)
然而,x
的独特性是值得怀疑的,因为distinct
可能并不总是采取"正确"的行。distinct
编写的帮助说明
如果给定的输入组合有多个行,则仅保留第一行。如果省略,将使用所有变量。
但在这里,它显然占据了最后一排。
我们可以使用slice_head
library(dplyr)
df %>%
group_by(y, z) %>%
mutate(n = n()) %>%
slice_head(n = 1)
# A tibble: 3 x 4
# Groups: y, z [3]
# x y z n
# <dbl> <dbl> <dbl> <int>
#1 1 10 100 2
#2 3 10 101 1
#3 4 20 200 1