[英]How to subset a data.frame?
我有這樣的數據集
a <- data.frame(var1 = c("patientA", "patientA", "patientA", "patientB", "patientB", "patientB", "patientB"),
var2 = as.Date(c("2015-01-02","2015-01-04","2015-02-02","2015-02-06","2015-01-02","2015-01-07","2015-04-02")),
var3 = c(F, T, F, F, F, T, F)
)
sequ <- rle(as.character(a$var1))
a$sequ <- sequence(sequ$lengths)
生產
> a
var1 var2 var3 sequ
1 patientA 2015-01-02 FALSE 1
2 patientA 2015-01-04 TRUE 2
3 patientA 2015-02-02 FALSE 3
4 patientB 2015-02-06 FALSE 1
5 patientB 2015-01-02 FALSE 2
6 patientB 2015-01-07 TRUE 3
7 patientB 2015-04-02 FALSE 4
我如何對這個數據集進行子集化/過濾,以便獲得var3 == TRUE和var2日期values的數據的數據的VAR3 == TRUE的行(患者,var1?我試過了)
subset(a, (var3 == TRUE) & (var2 > var3))
但這不會產生正確的結果集。 正確的是
# var1 var2 var3 sequ
# 1 patientA 2015-01-04 TRUE 2
# 2 patientA 2015-02-02 FALSE 3
# 3 patientB 2015-02-06 FALSE 1
# 4 patientB 2015-01-07 TRUE 3
# 5 patientB 2015-04-02 FALSE 4
您可以嘗試使用data.table
。 在這里,我們將'data.frame'轉換為'data.table'( setDT(a)
),按'var1'分組,我們得到大於或等於'var2'的'var2'元素的邏輯索引'var3'為TRUE的元素和數據集.SD
子集。
library(data.table)
setDT(a)[,.SD[var2 >= var2[var3]], var1]
# var1 var2 var3 sequ
#1: patientA 2015-01-04 TRUE 2
#2: patientA 2015-02-02 FALSE 3
#3: patientB 2015-02-06 FALSE 1
#4: patientB 2015-01-07 TRUE 3
#5: patientB 2015-04-02 FALSE 4
使用base R
的選項(假設數據按'var1'排序)
a[with(a, var2>=rep(var2[var3], table(var1))),]
# var1 var2 var3 sequ
#2 patientA 2015-01-04 TRUE 2
#3 patientA 2015-02-02 FALSE 3
#4 patientB 2015-02-06 FALSE 1
#6 patientB 2015-01-07 TRUE 3
#7 patientB 2015-04-02 FALSE 4
當var3
為TRUE
,我添加一個包含日期的列,根據它進行過濾,然后將其放在最后。
library(dplyr)
a %>% group_by(var1)%>%
mutate(truedate = first(var2[var3])) %>%
filter(var2 >= truedate) %>%
select(-truedate)
# Source: local data frame [5 x 4]
# Groups: var1
# var1 var2 var3 sequ
# 1 patientA 2015-01-04 TRUE 2
# 2 patientA 2015-02-02 FALSE 3
# 3 patientB 2015-02-06 FALSE 1
# 4 patientB 2015-01-07 TRUE 3
# 5 patientB 2015-04-02 FALSE 4
基礎R解決方案 :首先,不要打擾您的rle
/ sequ
事物。 而是,您的數據排序:
a <- a[order(a$var1,a$var2),]
查找選定的行:
myrows <- tapply(
1:nrow(a),
a$var1,
function(ivec){
istar <- ivec[a$var3[ivec]]
ivec[ivec>=istar]
})
帶有a[unlist(myrows),]
子集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.