Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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 获取在不同时间点询问的变量的最新观察结果_R_Dplyr - Fatal编程技术网

R 获取在不同时间点询问的变量的最新观察结果

R 获取在不同时间点询问的变量的最新观察结果,r,dplyr,R,Dplyr,有人已经在一个简单的版本中提出了这个问题,但我无法让它在我的案例中发挥作用 我有多年来针对一系列问题对许多人的观察数据,但不是每个人每年都被问到每一个问题。我想生成一个新的数据帧,其中包含每个人的最新答案 数据如下所示: df <- data.frame(individual = c("A", "A", "A", "A", "B", "B", "B",

有人已经在一个简单的版本中提出了这个问题,但我无法让它在我的案例中发挥作用

我有多年来针对一系列问题对许多人的观察数据,但不是每个人每年都被问到每一个问题。我想生成一个新的数据帧,其中包含每个人的最新答案

数据如下所示:

df <- data.frame(individual = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"), time = c(1:4), questionA = c("Yes", NA, "No", NA, "No", NA, "No", "Yes", "No", NA, NA, "No"), questionB = c(3, 5, 4, 5, 8, 6, 7, 4, 3, 1, 5, NA)) 
most_recent <- data.frame(individual = c("A", "B", "C"), questionA = c("No", "Yes", "No"), questionB = c(5, 4, 5))

df我们可以使用
dplyr
cross()

df %>%
  group_by(individual) %>%
  summarize(across(starts_with("question"), ~ last(na.omit(.))))
# # A tibble: 3 x 3
#   individual questionA questionB
#   <chr>      <chr>         <dbl>
# 1 A          No                5
# 2 B          Yes               4
# 3 C          No                5
df%>%
分组(个人)%>%
总结(跨越(以(“问题”)开头),最后一个(省略())
##tibble:3 x 3
#个人问题A问题B
#                  
#1号A 5号
#2 B是的4
#3 C第5号

My take in base R,它根据每个人的最近时间过滤df

df <- data.frame(individual = c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C"), 
                 time = c(1:4), 
                 questionA = c("Yes", NA, NA, "No", "No", NA, NA, "Yes", "No", NA, NA, "No"), 
                 questionB = c(3, 5, 4, 5, 8, 6, 7, 4, 3, 1, 3, 5),stringsAsFactors = F) 

#new column to use with %in% 
df$match <- paste(df$individual, df$time)

#find the most recent sample for each individual
id <- unique(df$individual)
most_recent <- sapply(id, function(id){
  time <- max(df$time[df$individual == id])
  return(paste(id,time))
})
#filter df by most recent
final <- df[df$match %in% most_recent,]

final

   individual time questionA questionB match
4           A    4        No         5   A 4
8           B    4       Yes         4   B 4
12          C    4        No         5   C 4

df我们可以在
之后使用
slice\u tail
填充
将“问题”NA与相邻的非NA,按“个人”、“时间”列分组和排序

library(dplyr)
library(tidyr)
df %>% 
  arrange(individual, time) %>%
  select(-time) %>%
  group_by(individual) %>% 
  fill(starts_with('question')) %>% 
  slice_tail(n = 1) %>%
  ungroup
-输出

# A tibble: 3 x 3
#  individual questionA questionB
#  <chr>      <chr>         <dbl>
#1 A          No                5
#2 B          Yes               4
#3 C          No                5
#一个tible:3 x 3
#个人问题A问题B
#                 
#1号A 5号
#2 B是的4
#3 C第5号

我正在处理大量变量,因此将此Cross()方法与上面Waldi的答案结合起来将非常有帮助!非常感谢。坦率地说,我不知道你为什么要把这些方法结合起来
last(question)
是一种较短的dplyr本机方式,用于
tail(question,1)
,并且
na。省略(question)
是一种较短的方式,用于
question[!is.na(question)]