2016-03-17 65 views
2

我有一個表稱爲myTable(輸入):排序表的唯一參數

user_name session_num 
1  "Joe"   1  
2  "Tom"   2  
3 "Fred"   1  
4  "Tom"   1  
5  "Joe"   2  
6  "John"   1 

我想知道有多少我user_id只有session_num = 1(輸出):

user_name session_num 
1  "Fred"    1 
2  "John"    1 

回答

8

下面是使用data.table

library(data.table) 
setDT(df)[, if(all(session_num == 1)) .SD, by = user_name] 
# user_name session_num 
# 1:  Fred   1 
# 2:  John   1 

另一種選擇是嘗試反聯接

df[session_num == 1][!df[session_num != 1], on = "user_name"] 
# user_name session_num 
# 1:  Fred   1 
# 2:  John   1 
+0

Thx它很棒! – Smasell

+0

您可能還想閱讀[this](https://github.com/Rdatatable/data.table/wiki/Getting-started)以便更加舒適地使用'data.table' –

0

這是2行答案:

library(data.table) 
data1<-fread("test.csv") 
data1[user_name == names(which(table(data1$user_name)==1)),][session_num==1,] 

首先看看誰在數據集中只有一次,然後是其中的那些子集,其中session_num==1

+1

如果更換''==用'%在%''後你user_name'得到預期的結果。隨着data.table(v1.9.6)的最新正式版本的發佈,代碼會引發錯誤。 – RHertel

+0

不確定這個答案使用了哪個'data.table'特定功能。 –

3

或者我們可以簡單地排除具有比1其他會話號的所有用戶可能的解決方案,使用base R.

# User's with session number other than 1 
two <- myTable$user_name[myTable$session_num != 1] 

# Exclude them 
myTable[!myTable$user_name %in% two,] 
# user_name session_num 
#3  Fred   1 
#6  John   1 
+1

有趣的是,我們想到了這漂亮很多同時。儘管我認爲使用'!= 1'而不是'== 2'更安全,以涵蓋所有可能性。 –

5

dplyr一個同類解決方案:

library(dplyr) 
myTable %>% 
    group_by(user_name) %>% 
    filter(all(session_num == 1)) 

這給:

user_name session_num 
    (fctr)  (int) 
1  Fred   1 
2  John   1 
+0

錯誤:找不到函數「%>%」(已安裝dplyr) – Smasell

+0

您有哪個版本的'dplyr'?或者,也許你忘了加載'library(dplyr)'? (查看更新後的答案) – Jaap

+0

謝謝你的工作!最後一個問題 - 如何在桌子上得到這個結果? – Smasell