在R中组合面板数据集中变量的更好方法?

在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

我使用的是小组数据,其中一些问卷项目只被问了一次,而大多数其他项目在不同的波中被问了几次。让我们假设我有一个分类变量的调查结果

尽管专家组成员在回答某个问题时可能会保持稳定,但他们可能会改变自己的观点,甚至退出专家组。其他人可能在稍后的时间点(在稍后的浪潮中)进入面板

假设这导致了一个类似这样的数据集,其中var_1a和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