2014-11-05 14 views
0

我想要爲數據框創建子集以包含具有> 1條記錄的主題的所有記錄,並且只將這些主題排除在1條記錄之外。R - 僅包含超過1條記錄的主題的子集數據框

讓我們看看下面的數據框;

mydata <- data.frame(subject_id = factor(c(1,2,3,4,4,5,5,6,6,7,8,9,9,9,10)), 
        variable = rnorm(15)) 

下面的代碼給我具有> 1個結果使用複製的對象();

duplicates <- mydata[duplicated(mydata$subject_id),]$subject_id 

但我想在我的子集,保留所有記錄用> 1點的記錄每一個主題,所以我嘗試;

mydata[mydata$subject_id==as.factor(duplicates),] 

哪個不會返回我期待的結果。

任何想法?

+0

您不需要(也不應該)使用像'as.data.frame(cbind(...))'。只需使用'data.frame(var1 = ...,var2 = ...)'(參見我的編輯你的問題)。這樣,您還可以避免在您的全局環境中創建諸如subject_id和變量之類的許多對象,儘管您只需要它們在data.frame中。 – 2014-11-05 08:42:48

回答

1

一個簡單的選擇是使用dplyr

library(dplyr) 
dfr <- data.frame(a=sample(1:2,10,rep=T), b=sample(1:5,10, rep=T)) 
dfr <- group_by(dfr, b) 
dfr 
# Source: local data frame [10 x 2] 
# Groups: b 
# 
# a b 
# 1 2 4 
# 2 2 2 
# 3 2 5 
# 4 2 1 
# 5 1 2 
# 6 1 3 
# 7 2 1 
# 8 2 4 
# 9 1 4 
# 10 2 4 
filter(dfr, n() > 1) 
# Source: local data frame [8 x 2] 
# Groups: b 
# 
# a b 
# 1 2 4 
# 2 2 2 
# 3 2 1 
# 4 1 2 
# 5 2 1 
# 6 2 4 
# 7 1 4 
# 8 2 4 
+0

謝謝。所有的答案都有效,但我覺得這個和data.table解決方案是其他問題最普遍的。我選擇了這個b/c,它允許我繼續使用data.frame而不是data.table來處理數據。 – 2014-11-06 16:39:12

0

我不得不編輯您的數據幀一點點:

set.seed(20) 
subject_id <- as.factor(c(1,2,3,4,4,5,5,6,6,7,8,9,9,9,10)) 
variable <- rnorm(15) 
mydata<-as.data.frame(cbind(subject_id, variable)) 

現在把所有的行對於出現不止一次科目:

mydata[duplicated(mydata$subject_id) 
     | duplicated(mydata$subject_id, fromLast = TRUE), ] 
# subject_id variable 
# 4   4 -1.3325937 
# 5   4 -0.4465668 
# 6   5 0.5696061 
# 7   5 -2.8897176 
# 8   6 -0.8690183 
# 9   6 -0.4617027 
# 12   9 -0.1503822 
# 13   9 -0.6281268 
# 14   9 1.3232209 

編輯:這也將工作,使用duplicates載體:

mydata[mydata$subject_id %in% duplicates, ] 
+0

這有效,並查看'fromLast = TRUE'返回的參數並再次查看幫助文件,我相信我明白了原因。我沒有想過「重複()確定哪些元素的矢量或數據框是重複的元素**與小的下標**」從幫助文件意味着什麼。你知道一個函數可以識別矢量中的重複項,而不管索引中的位置嗎? – 2014-11-05 00:50:29

+0

謝謝!使用我的重複矢量進行編輯是我一直在尋找的解決方案。儘管現在提供了其他幾個答案,但我發現使用{dplyr}或{data.table}是一種更加優雅的方法來完成此操作,因此將選擇其中一個作爲其他讀者的答案以供其他讀者使用 – 2014-11-06 16:40:00

0
Here you go (I changed your variable to var <- rnorm(15): 


set.seed(11) 

subject_id<-as.factor(c(1,2,3,4,4,5,5,6,6,7,8,9,9,9,10)) 
var<-rnorm(15) 
mydata<-as.data.frame(cbind(subject_id,var)) 

x1 <- c(names(table(mydata$subject_id)[table(mydata$subject_id) > 1])) 
x2 <- which(mydata$subject_id %in% x1) 
mydata[x2,] 

    subject_id var 
4   4 0.3951076 
5   4 -2.4129058 
6   5 -1.3309979 
7   5 -1.7354382 
8   6 0.4020871 
9   6 0.4628287 
12   9 -2.1744466 
13   9 0.4857337 
14   9 1.0245632 
0

嘗試:

> mydata[mydata$subject_id %in% mydata[duplicated(mydata$subject_id),]$subject_id,] 
    subject_id variable 
4   4 -1.3325937 
5   4 -0.4465668 
6   5 0.5696061 
7   5 -2.8897176 
8   6 -0.8690183 
9   6 -0.4617027 
12   9 -0.1503822 
13   9 -0.6281268 
14   9 1.3232209 
+0

Thanks,This works and is is基本上是@Kara Woo在編輯 – 2014-11-06 16:26:00

2

一個data.table解決

set.seed(20) 
subject_id <- as.factor(c(1,2,3,4,4,5,5,6,6,7,8,9,9,9,10)) 
variable <- rnorm(15) 
mydata<-as.data.frame(cbind(subject_id, variable)) 

library(data.table) 
setDT(mydata)[, .SD[.N > 1], by = subject_id] # @Thanks David. 
# subject_id variable 
# 1:   4 -1.3325937 
# 2:   4 -0.4465668 
# 3:   5 0.5696061 
# 4:   5 -2.8897176 
# 5:   6 -0.8690183 
# 6:   6 -0.4617027 
# 7:   9 -0.1503822 
# 8:   9 -0.6281268 
# 9:   9 1.3232209 
+1

中添加的內容我認爲它應該是'setDT(mydata)[,.SD [.N> 1],by = subject_id]',因爲如果有多個列,你需要指定他們用你的方法 – 2014-11-05 07:10:56

+0

@DavidArenburg,確實。 – KFB 2014-11-05 11:45:21

相關問題