Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于多种条件提取NA数据_R_Dataframe - Fatal编程技术网

R 基于多种条件提取NA数据

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

我不知道怎么做,所以从这个意义上说,我的问题有点宽泛。我的真实数据集包含来自100多人的数据,他们必须在4个时间点填写问卷。我的一些数据丢失了,我想知道的是:如果数据丢失了,那么该人在该时间点的整个问卷是否丢失了数据?或者可能是一个人在同一时间点只“未能”回答一个或几个问题<下面数据集中的代码>问题从A到F(即6个问题)

我希望它能够工作的示例代码:

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
?详细解决方案,谢谢。这取决于