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)]