在R中组合面板数据集中变量的更好方法?
我使用的是小组数据,其中一些问卷项目只被问了一次,而大多数其他项目在不同的波中被问了几次。让我们假设我有一个分类变量的调查结果 尽管专家组成员在回答某个问题时可能会保持稳定,但他们可能会改变自己的观点,甚至退出专家组。其他人可能在稍后的时间点(在稍后的浪潮中)进入面板 假设这导致了一个类似这样的数据集,其中var_1a和var_1b是两个变量,在两个不同的波中测量相同的东西:在R中组合面板数据集中变量的更好方法?,r,function,panel-data,R,Function,Panel Data,我使用的是小组数据,其中一些问卷项目只被问了一次,而大多数其他项目在不同的波中被问了几次。让我们假设我有一个分类变量的调查结果 尽管专家组成员在回答某个问题时可能会保持稳定,但他们可能会改变自己的观点,甚至退出专家组。其他人可能在稍后的时间点(在稍后的浪潮中)进入面板 假设这导致了一个类似这样的数据集,其中var_1a和var_1b是两个变量,在两个不同的波中测量相同的东西: mydata<-data.frame( var_1a = c(1,2,3,4,5,NA), var_1b
mydata<-data.frame(
var_1a = c(1,2,3,4,5,NA),
var_1b = c(1,2,5,5,NA,NA)
)
mydata您可以通过避免使用ifelse
s来更清楚地表达这一点
combo2 <- function(dat, sset) {
r <- rowMeans(dat[sset], na.rm=TRUE)
r[is.nan(r)] <- NA
return(r)
}
mydata1$combo_var <- combo2(mydata1, c("var_1a", "var_1b"))
# var_1a var_1b combo_var
# 1 1 1 1.0
# 2 2 2 2.0
# 3 3 -3 0.0
# 4 4 9 6.5
# 5 5 NA 5.0
# 6 NA NA NA
# 7 NA NA NA
# 8 NA NA NA
# 9 NA NA NA
# 10 NA NA NA
combo2一些tidyverse
选项:
资料
选择2
好的,谢谢。但是你知道为什么引入了NaN
而不仅仅是NAs吗?在进行计算时通常会出现NaN(不是数字),但结果不能用数字表示。如果我们设置了na.rm=F
,那么对于第5行和第6行,它将返回na
。由于我们告诉rowMeans
删除NAs,我们基本上得到了一个无法计算的结果,所以NaN。这里的关键是该值没有丢失,但无法计算。对pmap
选项的微小更改
> mydata$combo_var<-combo(mydata, c("var_1a","var_1b"))
> mydata
var_1a var_1b combo_var
1 1 1 1.0
2 2 2 2.0
3 3 -3 0.0
4 4 9 6.5
5 5 NA 5.0
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
combo2 <- function(dat, sset) {
r <- rowMeans(dat[sset], na.rm=TRUE)
r[is.nan(r)] <- NA
return(r)
}
mydata1$combo_var <- combo2(mydata1, c("var_1a", "var_1b"))
# var_1a var_1b combo_var
# 1 1 1 1.0
# 2 2 2 2.0
# 3 3 -3 0.0
# 4 4 9 6.5
# 5 5 NA 5.0
# 6 NA NA NA
# 7 NA NA NA
# 8 NA NA NA
# 9 NA NA NA
# 10 NA NA NA
mydata1 <- structure(list(var_1a = c(1L, 2L, 3L, 4L, 5L, NA, NA, NA, NA,
NA), var_1b = c(1L, 2L, -3L, 9L, NA, NA, NA, NA, NA, NA)), row.names = c(NA,
-10L), class = "data.frame")
mydata <- data.frame(
var_1a = c(1,2,3,4,5,NA),
var_1b = c(1,2,5,5,NA,NA)
)
library(dplyr)
library(purrr)
mydata <- mydata %>%
mutate(
combo_var = pmap_dbl(select(., contains("var")),
~mean(c(...), na.rm = T))
)
var_1a var_1b combo_var
1 1 1 1.0
2 2 2 2.0
3 3 5 4.0
4 4 5 4.5
5 5 NA 5.0
6 NA NA NaN
mydata <- mydata %>%
mutate(
combo_var = rowMeans(select(., contains("var")), na.rm = T)
)
var_1a var_1b combo_var
1 1 1 1.0
2 2 2 2.0
3 3 5 4.0
4 4 5 4.5
5 5 NA 5.0
6 NA NA NaN