2016-08-04 36 views
1

我的數據是這樣的:找到相關的組

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中的其他行中)。它如何索引它?

+1

然而簡單化,這是一個代碼寫入請求 –

+0

您是否嘗試過'表(DF1 $組,DF2 $ NUM)'? – angelous

回答

0

這裏使用data.table來檢查'num'列中uniqueunique元素在'group'分組後是否只有1的選項。將'data.frame'轉換爲'data.table'(setDT(df1)),按'組'分組,iflength,unique'num'中的元素爲1,則我們得到data.table的子集(.SD

library(data.table) 
setDT(df1)[, if(uniqueN(num) == 1) .SD, by = group] 

注意:在OP提供的示例中,所有「組」都只有一個唯一元素,因此它將獲得完整的數據集。

如果我們需要的「基團」的id爲僅具有單個unique元件

setDT(df1)[, if(uniqueN(num) == 1) group, by = group]$V1 
#[1] 433 211 309 424 947 

如果我們需要的「NUM」列與每當有僅單個unique「「基團」沿「每個 '組' NUM

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 
+0

謝謝你的作品完美。只是一些澄清。我可以讓0組更改1值相同嗎? – Jake

+0

@Jake它正在檢查'num'中的值是否只是每個'group'的特定類型,所以即使它是1,0或任何其他值 – akrun

+0

也會工作。謝謝。是否有可能在你的代碼的這一行還保留每個組的set(0,1)setDT(df1)[,if(uniqueN(num)== 1)group,by = group] $ V1' ? – Jake

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

你可以看到每個組有多少不同的價值觀基礎R與tapply

with(dd, tapply(num, group, function(x) length(unique(x)))) 

無再indexin g需要。

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

@akrun請停止此操作。我沒有降低你的答案。 –

+0

我並沒有說你低估了它,我是在問你的意見,爲什麼它在你同時發佈時被降低了。 – akrun

+0

@akrun我不知道爲什麼有人會低估你的答案,爲什麼我的答案被低估? –