R 基于多种条件提取NA数据
我不知道怎么做,所以从这个意义上说,我的问题有点宽泛。我的真实数据集包含来自100多人的数据,他们必须在4个时间点填写问卷。我的一些数据丢失了,我想知道的是:如果数据丢失了,那么该人在该时间点的整个问卷是否丢失了数据?或者可能是一个人在同一时间点只“未能”回答一个或几个问题<下面数据集中的代码>问题从A到F(即6个问题) 我希望它能够工作的示例代码:R 基于多种条件提取NA数据,r,dataframe,R,Dataframe,我不知道怎么做,所以从这个意义上说,我的问题有点宽泛。我的真实数据集包含来自100多人的数据,他们必须在4个时间点填写问卷。我的一些数据丢失了,我想知道的是:如果数据丢失了,那么该人在该时间点的整个问卷是否丢失了数据?或者可能是一个人在同一时间点只“未能”回答一个或几个问题问题从A到F(即6个问题) 我希望它能够工作的示例代码: ID <- rep(1:10, each = 24) Question <- rep(LETTERS[1:6], 40) Value <- round
ID <- rep(1:10, each = 24)
Question <- rep(LETTERS[1:6], 40)
Value <- round(runif(length(ID), 0, 5))
Time <- rep(c(0, 1, 3, 4), each = 6, times = 10)
df <- data.frame(ID, Question, Value, Time)
dfValue <- df[19:24, ]
df[19:24, ]$Value <- NA
df[28:30, ]$Value <- NA
df[49, ]$Value <- NA
df[55:61, ]$Value <- NA
这适用于像我给出的那样的小数据集(并且没有太多的NAs
),但一旦有了大数据集,它就会变得单调乏味。有没有一种方法可以达到同样的效果,但更方便?我自己的数据集返回一个包含569个观察值的数据帧。在眼睛上要经历的有点多
为清晰起见:某些算法/代码将检查每个ID
(或每个值==NA
)是否所有其他值在同一时间
也是NA
。想法是它将返回(基于上述示例数据):
您可以使用tapply
来测试all(is.na(x))
,x
是df$Value
的每一块,由df$ID
和df$Time
分割:
tapply(df$Value, list(df$ID, df$Time), function(x) all(is.na(x)))
编辑(见评论)
您可以使用tapply
来测试all(is.na(x))
,x
是df$Value
的每一块,由df$ID
和df$Time
分割:
tapply(df$Value, list(df$ID, df$Time), function(x) all(is.na(x)))
编辑(见评论)
您应该使用强大的data.table包
library(data.table)
setDT(df)
# This will show in what time and ID, how many are missing
df[,missing := sum(is.na(Value)), .(Time,ID)]
# this will should all cases where the value is missing
df[missing != 0]
# next you can do simple aggregations to get answers like
# get cases where all values are missing
df[missing == 6]
#The second part of your question can be solved by subsetting this data.
#For example:
df[(ID == 1) & (is.na(Value))]
您应该使用强大的data.table包
library(data.table)
setDT(df)
# This will show in what time and ID, how many are missing
df[,missing := sum(is.na(Value)), .(Time,ID)]
# this will should all cases where the value is missing
df[missing != 0]
# next you can do simple aggregations to get answers like
# get cases where all values are missing
df[missing == 6]
#The second part of your question can be solved by subsetting this data.
#For example:
df[(ID == 1) & (is.na(Value))]
我将以以下方式使用dplyr
库:
library(dplyr)
df_summarized <-
df %>%
# Creating Answered variable to detect if there is an NA in Value variable
mutate(Answered = !is.na(Value)) %>%
# Group by ID and Time
group_by(ID, Time) %>%
# Sum the number of Answered for ID and Time
summarise(Num_Ans = sum(Answered))
库(dplyr)
df_汇总%
#创建应答变量以检测值变量中是否存在NA
突变(应答=!is.na(值))%>%
#按ID和时间分组
分组依据(ID,时间)%>%
#对ID和时间的应答次数求和
总结(数量=总和(已回答))
返回如下表:
ID Time Num_Ans
<int> <dbl> <int>
1 1 0 6
2 1 1 6
3 1 3 6
4 1 4 0
5 2 0 3
6 2 1 6
7 2 3 6
8 2 4 6
9 3 0 5
10 3 1 0
....
ID时间数
1 1 0 6
2 1 1 6
3 1 3 6
4 1 4 0
5 2 0 3
6 2 1 6
7 2 3 6
8 2 4 6
9 3 0 5
10 3 1 0
....
因此,您可以筛选ID和时间没有答案的情况,即Num_Ans=0:
df_Sum %>% filter(Num_Ans == 0)
ID Time Num_Ans
<int> <dbl> <int>
1 1 4 0
2 3 1 0
df_Sum%>%过滤器(Num_Ans==0)
ID时间数
1 1 4 0
2 3 1 0
您还可以筛选未回答所有答案的情况,即Num_Ans<6和Num_Ans!=0:
df_Sum %>%
filter(Num_Ans < 6 & Num_Ans != 0)
ID Time Num_Ans
<int> <dbl> <int>
1 2 0 3
2 3 0 5
3 3 3 5
df_总和%>%
过滤器(数值小于6&Num!=0)
ID时间数
1 2 0 3
2 3 0 5
3 3 3 5
我将以以下方式使用dplyr
库:
library(dplyr)
df_summarized <-
df %>%
# Creating Answered variable to detect if there is an NA in Value variable
mutate(Answered = !is.na(Value)) %>%
# Group by ID and Time
group_by(ID, Time) %>%
# Sum the number of Answered for ID and Time
summarise(Num_Ans = sum(Answered))
库(dplyr)
df_汇总%
#创建应答变量以检测值变量中是否存在NA
突变(应答=!is.na(值))%>%
#按ID和时间分组
分组依据(ID,时间)%>%
#对ID和时间的应答次数求和
总结(数量=总和(已回答))
返回如下表:
ID Time Num_Ans
<int> <dbl> <int>
1 1 0 6
2 1 1 6
3 1 3 6
4 1 4 0
5 2 0 3
6 2 1 6
7 2 3 6
8 2 4 6
9 3 0 5
10 3 1 0
....
ID时间数
1 1 0 6
2 1 1 6
3 1 3 6
4 1 4 0
5 2 0 3
6 2 1 6
7 2 3 6
8 2 4 6
9 3 0 5
10 3 1 0
....
因此,您可以筛选ID和时间没有答案的情况,即Num_Ans=0:
df_Sum %>% filter(Num_Ans == 0)
ID Time Num_Ans
<int> <dbl> <int>
1 1 4 0
2 3 1 0
df_Sum%>%过滤器(Num_Ans==0)
ID时间数
1 1 4 0
2 3 1 0
您还可以筛选未回答所有答案的情况,即Num_Ans<6和Num_Ans!=0:
df_Sum %>%
filter(Num_Ans < 6 & Num_Ans != 0)
ID Time Num_Ans
<int> <dbl> <int>
1 2 0 3
2 3 0 5
3 3 3 5
df_总和%>%
过滤器(数值小于6&Num!=0)
ID时间数
1 2 0 3
2 3 0 5
3 3 3 5
这似乎完全符合我的期望。只有最后一行代码不是我的意思。我的意思是:df[missing<6&missing>0]
。这只返回大于0且小于6的缺失,对吗?是的,完全正确。把条件放在括号里。我担心没有括号可能会出错。尝试不同的值组合,您将了解输出是如何变化的。我想了想:如果我强制将数据帧
转换为数据。表
,这对其他软件包或其他标准r用法有影响吗?例如,我使用ggplot2,lotdata.table本身也是data.frame。你可以按标准使用它。最好读一读:这似乎和我所希望的完全一样。只有最后一行代码不是我的意思。我的意思是:df[missing<6&missing>0]
。这只返回大于0且小于6的缺失,对吗?是的,完全正确。把条件放在括号里。我担心没有括号可能会出错。尝试不同的值组合,您将了解输出是如何变化的。我想了想:如果我强制将数据帧
转换为数据。表
,这对其他软件包或其他标准r用法有影响吗?例如,我使用ggplot2,lotdata.table本身也是data.frame。你可以按标准使用它。最好读一读:想想塔普利是聪明的。然而,它并不像我希望的那样完全有效。是否有办法更改它,使其仅在NAs量大于0且类似于%1:5中的sum(Is.na(x))%时返回一个值或TRUE
。然而,它并不像我希望的那样完全有效。是否有方法更改它,使其仅在NAs量大于0且类似于%1:5中的sum(Is.na(x))%时返回值或TRUE
?详细解决方案,谢谢。这取决于