對于某些情況,我想有一種方法可以在某個測驗中過濾某個值。如果一個人具有所需的值,則他的所有測驗及其結果都應保留在資料中。如果不是,則應洗掉其所有資料。以下代碼應該有所幫助。
person <- c('pers1', 'pers1', 'pers2', 'pers2', 'pers2', 'pers3', 'pers3', 'pers4', 'pers5', 'pers5', 'pers6')
test <-c('a', 'b', 'a', 'b', 'c', 'b', 'c', 'a' , 'a', 'c', 'b' )
value <-c(2, 3, 4, 2, 1, 5, 7, 4, 1, 3, 1)
data <- data.frame(person,test,value)
head(data,20)
使用以下代碼,我將洗掉所有沒有進行過“a”測驗的人。分別是第 3 個人和第 6 個人。我保留所有完成測驗“a”的人,同時存盤他們所有其他測驗,以便稍后我可以進行一些統計和相關性分析。
data1 <- data[data$person %in% data[data$test=='a',]$person,]
data1
但是,我想在“過濾”上添加另一層。我想過濾掉測驗“a”中價值為 3 或以上的人。這意味著我只剩下第 1 個人和第 5 個人(還有他們的其他測驗)來說明問題,這就是我想要留下的:
person1 <- c('pers1', 'pers1', 'pers5', 'pers5')
test1 <- c('a', 'b', 'a', 'c')
value1 <- c(2,3,1,3)
data1 <- data.frame(person1,test1,value1)
data1
我希望這是足夠的資料供您使用。第一次在這里發布代碼。
uj5u.com熱心網友回復:
您可以將該要求添加到您的子查詢中
data[data$person %in% data[data$test=='a' & data$value<3,]$person,]
# person test value
# 1 pers1 a 2
# 2 pers1 b 3
# 9 pers5 a 1
# 10 pers5 c 3
如果你想使用dplyr,你可以使用group_by()和filter()
library(dplyr)
data %>%
group_by(person) %>%
filter(any(test=="a" & value < 3))
uj5u.com熱心網友回復:
使用ave來自base R
subset(data, ave(test == 'a' & value < 3, person, FUN = any))
person test value
1 pers1 a 2
2 pers1 b 3
9 pers5 a 1
10 pers5 c 3
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333111.html
