说我有一个纵向数据集如下
ID <- c(1, 1, 2, 2, 3, 3, 4, 4)
time <- c(1, 2, 1, 2, 1, 2, 1, 2)
value <- c(7, 5, 9, 2, NA, 3, 7, NA)
mydata <- data.frame(ID, time, value)
ID time value
1 1 1 7
2 1 2 5
3 2 1 9
4 2 2 2
5 3 1 NA
6 3 2 3
7 4 1 7
8 4 2 NA
在这个数据集中,我们有4个案例在两个时间点都有数据(让我们说治疗前后)
我想要做的是设置标准,以删除两个时间点不完整的任何案例。在这个例子中,我想删除ID3(缺少时间点1)和ID4(缺少时间点2)。如下所示:
ID time value
1 1 1 7
2 1 2 5
3 2 1 9
4 2 2 2
我没有太多运气。我尝试过complete.cases()的变体或者哪些()无效
我还是R的新手,如果有人能帮助我,我会非常感激
编辑:谢谢Ronak回答我的问题。在反映我的真实数据后,我遇到了第二个问题。我的实际数据更多地反映在下面:
ID <- c(1, 1, 2, 2, 3, 3, 4, 4, 5, 6, 7, 8)
time <- c(1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1)
value <- c(7, 5, 9, 2, NA, 3, 7, NA, 8, 9, 7, 6)
mydata <- data.frame(ID, time, value)
ID time value
1 1 1 7
2 1 2 5
3 2 1 9
4 2 2 2
5 3 1 NA
6 3 2 3
7 4 1 7
8 4 2 NA
9 5 1 8
10 6 1 9
11 7 1 7
12 8 1 6
我还想要删除案例5,6,7和8.这些ID有时间1的条目,但没有时间2.希望这是有道理的
感谢一堆
答案 0 :(得分:0)
查看更新的答案
Sub MoveFiles()
Dim r As Range
With Worksheets("Sheet1")
For Each r In .Range("A1", .Range("A" & .Rows.Count).End(xlUp))
FileCopy r.Value, r.Offset(0, 1).Value
Kill r.Value
Next
End With
End Sub
答案 1 :(得分:0)
如果您将数据切换为宽格式(每个时间点都表示为自己的列),则可以使用na.omit
。使用dplyr
和tidyr
函数:
library(dplyr)
mydata <- mydata %>%
tidyr::spread(key=time, value=value) %>% # reformat to wide
na.omit() %>% # delete cases with missingness on any variable (i.e. any time point)
tidyr::gather(key="time", value="value", -ID) # put it back in long format
> mydata
ID time value
1 1 1 7
2 2 1 9
3 1 2 5
4 2 2 2
请注意,即使您在数据中没有显式NA的情况下缺少时间点,这样也可以(仅保留时间1和时间2的完整数据的情况),如下所示:
> mydata
ID time value
1 1 1 7
2 1 2 5
3 2 1 9
4 2 2 2
5 3 1 NA
6 3 2 3
7 4 1 7
8 4 2 NA
9 5 1 8
10 6 1 9
11 7 1 7
12 8 1 6
答案 2 :(得分:0)
您可以使用sqldf
轻松完成此操作。
library(sqldf)
sqldf(' select * from (select ID, count(*) as cnt from mydata where value is not null group by id having cnt >1 ) t1 inner join mydata t2 on t1.ID=t2.ID')
您可以选择计数大于1的ID,并且在其值中没有NA,然后与原始数据联接。
答案 3 :(得分:0)
@Ronak已经提供
printf()
对于第二部分,您可以将每个ID分组并过滤其频率
mydata[!mydata$ID %in% mydata$ID[is.na(mydata$value)], ]
k2 <- data.frame(table(mydata$ID))
然后执行类似
的操作 k2$Var1[k2$Freq > 1]