R 基于另一个值的值对列变量的值范围进行子集设置
我试图将我的所有行保留在数据框中,但删除表2中的行,这些行不属于表8中至少2年的行R 基于另一个值的值对列变量的值范围进行子集设置,r,range,subset,R,Range,Subset,我试图将我的所有行保留在数据框中,但删除表2中的行,这些行不属于表8中至少2年的行 library(tidyverse) forms <- data_frame( CASEID = rep(01012,5), VISIT = c(450, 450, 365, 365, 450), FORM = c(18, 8, 7, 2, 2), DTYvisit = c(2006, 2006, 2003, 2003, 2006) ) > forms # A tibble: 5 x 4
library(tidyverse)
forms <- data_frame( CASEID = rep(01012,5), VISIT = c(450, 450, 365, 365, 450), FORM = c(18, 8, 7, 2, 2), DTYvisit = c(2006, 2006, 2003, 2003, 2006) )
> forms # A tibble: 5 x 4
CASEID VISIT FORM YEAR
<dbl> <dbl> <dbl> <dbl>
1 1012 450 18 2006
2 1012 450 8 2006
3 1012 365 7 2003
4 1012 365 2 2003
5 1012 450 2 2004
6 1013 450 8 2003
7 1013 450 18 2003
8 1013 450 2 2003
9 1012 450 2 2009
关于如何删除不在表8 DTyvisit<2年范围内的表2行,有什么建议吗
这非常有效:
form2.matchedOnForm8 <- forms %>% group_by(CASEID) %>% filter(FORM == 8) %>% select(CASEID, VISIT, DTYvisit) %>% left_join(filter(forms, FORM == 2), by = c("CASEID", "VISIT", "DTYvisit")) %>% bind_rows(filter(forms, FORM != 2))
但现在我失去了观察
我需要以下资料:
library(tidyverse)
forms <- data_frame( CASEID = rep(01012,5), VISIT = c(450, 450, 365, 365, 450), FORM = c(18, 8, 7, 2, 2), DTYvisit = c(2006, 2006, 2003, 2003, 2006) )
> forms # A tibble: 5 x 4
CASEID VISIT FORM YEAR
<dbl> <dbl> <dbl> <dbl>
1 1012 450 18 2006
2 1012 450 8 2006
3 1012 365 7 2003
4 1012 450 2 2004
5 1013 450 8 2003
6 1013 450 18 2003
7 1013 450 2 2003
下面是一个使用outer来计算给定年份和8中可能存在的所有年份值之间的差异的解决方案
min(abs(as.numeric(outer(df[df$FORM==8,'YEAR'],df[1,'YEAR'],'-'))))
[1] 0
df$diff <- apply(df, 1, function(x) min(as.numeric(outer(df[df$FORM==8,'YEAR',drop=TRUE],as.numeric(x['YEAR']),'-'))))
library(dplyr)
df %>% group_by(CASEID) %>%
filter(!(FORM==2 & abs(diff)>2))
df <- read.table(text="
CASEID VISIT FORM YEAR
1 1012 450 18 2006
2 1012 450 8 2006
3 1012 365 7 2003
4 1012 365 2 2003
5 1012 450 2 2004
6 1013 450 8 2003
7 1013 450 18 2003
8 1013 450 2 2003
9 1012 450 2 2009
",header=T, stringsAsFactors = F)
很抱歉,我无法理解你的问题。我丢失了一些观察结果,因为一些ID的表格2与表格8的日期不相等。因此,现在我需要确保我保持中二的时间等于中八年,保持中二的时间在中八采取的2年之内。这是一个非常复杂的问题,我的中间经验似乎没有切分蛋糕。为什么这个案例4 1012 365 2 2003没有包括在预期的输出中。我得到了一个错误:>minabass.numericouterNPforms.sec2.qol.labs[NPforms.sec2.qol.labs$FORM==8,'DTYvisit'],NPforms.sec2.qol.labs[1,'DTYvisit'],'-'FUNX,Y中的错误, ... : 二进制运算符的非数值参数它们是整数,但我将它们更改为数值,仍然得到:FUNX中的错误,Y,…:二进制运算符StructureListCaseId=01012,VISIT=450,FORM=18,DTYvisit=2006,SDPRS=09,SDRS=076,TMMN=019,TMANE=00,TMANP=25,TMAPR=00,TMBMN=051,TMBNE=00,TMBNP=25,TMBPR=00,COUNT=03,BORNY=NA_整数,EDUCY=NA_字符,HANDD=NA_整数,HXLEA=NA_整数,HXLOC=NA_integer,NLANG=NA_integer,RACE=NA_integer,它需要是一个数据表吗?是的,我有一个表格8:>NPforms.sec2.qol.labs[NPforms.sec2.qol.labs$form==8,DTYvisit]a表:1388 x 1 DTYvisit 1 2006 2 2005 3 2005 4 2005 5 2005 6 2008 7 2005 8 2005 9 2005 10 2006。。。还有1378行>NPforms.sec2.qol.labs[1,DTYvisit]A tible:1 x 1 DTYvisit 1 2006->仍然无法工作。也许我在什么地方遗漏了双括号?或者也许有一种dplyr方法可以做到这一点?