我有这样的数据:
num group
0 433
0 433
0 433
0 211
0 211
0 211
1 309
1 309
1 309
0 424
0 947
1 309
0 433
我想检查一个特定的组在num列中是否总是0或1的值,但我的数据帧有很多行(即组433在开头,而且可能在df的其他行中)。如何对其进行索引?
答案 0 :(得分:1)
也许table
?
table(df)
group
num 211 309 424 433 947
0 3 0 1 4 1
1 0 4 0 0 0
<强>更新强>
以下是一些dplyr
替代方案:
library(dplyr)
# To find the number of distinct values per group
df %>% group_by(group) %>% summarise(n_distinct(num))
# To find groups that have only one distinct value and their corresponding value
df %>% group_by(group) %>%
summarise(UniqueNum = ifelse(n_distinct(num) > 1, NA, unique(num))) %>%
na.omit()
# To find all distinct values per group
df %>% group_by(group) %>% summarise(list(unique(num))) %>% tidyr::unnest()
答案 1 :(得分:1)
您可以在基础R
中查看每个组与tapply
有多少不同的值
with(dd, tapply(num, group, function(x) length(unique(x))))
无需重新编制索引。
答案 2 :(得分:1)
嗯,类似于@ Mr.Flick的方法。
您可以使用aggregate
查找每个组的unique
值
aggregate(num ~ group, df, unique)
# group num
#1 211 0
#2 309 1
#3 424 0
#4 433 0
#5 947 0
如果您只想要每次只有一个值的组,您可以将其扩展到
a <- aggregate(num ~ group, df, function(x) length(unique(x)) == 1)
a[a$num,1]
#[1] 211 309 424 433 947
答案 3 :(得分:0)
这是一个使用data.table来检查length
个unique
元素是否在&#39; num&#39;中的选项。在按&#39; group&#39;分组后,列只有1。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df1)
),按&#39;分组&#39;,if
length
unique
个元素组成&#39; num&#39;是1,然后我们得到data.table(.SD
)
library(data.table)
setDT(df1)[, if(uniqueN(num) == 1) .SD, by = group]
注意:在OP提供的示例中,所有&#39;组&#39;只有一个唯一元素,因此它将获得完整的数据集。
如果我们需要&#39;组&#39;只有一个unique
元素的ID
setDT(df1)[, if(uniqueN(num) == 1) group, by = group]$V1
#[1] 433 211 309 424 947
如果我们需要&#39; num&#39;专栏以及&#39; group&#39;只要只有一个unique
数字&#39;每个小组&#39;
setDT(df1)[,if(uniqueN(num)==1) .(num = num[1L]) , by = group]
# group num
#1: 433 0
#2: 211 0
#3: 309 1
#4: 424 0
#5: 947 0