在R studio中删除多行中的不完整案例

时间:2016-10-17 04:25:59

标签: r time rstudio rows missing-data

说我有一个纵向数据集如下

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.希望这是有道理的

感谢一堆

4 个答案:

答案 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。使用dplyrtidyr函数:

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]