【问题标题】:Create new set of columns out of two existing sets of columns based on factor value根据因子值从现有的两组列中创建一组新的列
【发布时间】:2018-05-22 00:57:21
【问题描述】:

我有名称为“VA01_01”、“VA01_02”等以及“VA02_01”、“VA02_02”的变量。前缀为 VA01 的变量来自女性参与者,前缀为 VA02 的变量来自男性参与者。例如,男性参与者在变量 VA01 中有 NA。我已经有了性别价值观的因素。

我想做的是创建一组新的变量来接管两种变量类型的值。也就是说,如果是男性参与者,他会得到那组变量中 VA02 变量的值。因此,新的变量集将不再有任何 NA,因为它不会基于性别。

有人对这个问题有简单的解决方案吗?我不知道 reshape 是否是答案,因为我真的不想将我的数据框转换为长格式。

这里是一开始的样子:

 structure(list(sex = structure(c(1L, 2L, 1L, 2L), .Label = c("female", 
 "male"), class = "factor"), VA01_01 = c(1, NA, 2, NA), VA01_02 = c(4, 
 NA, 4, NA), VA02_01 = c(NA, 3, NA, 4), VA02_02 = c(NA, 5, NA, 
 3)), .Names = c("sex", "VA01_01", "VA01_02", "VA02_01", "VA02_02"
 ), row.names = c(NA, -4L), class = "data.frame")

最后在这里(我想保留原始变量):

structure(list(sex = structure(c(1L, 2L, 1L, 2L), .Label = c("female", 
"male"), class = "factor"), VA_tot_01 = c(1, 3, 2, 4), VA_tot_02 = c(4, 
5, 4, 3), VA01_01 = c(1, NA, 2, NA), VA01_02 = c(4, NA, 4, NA
), VA02_01 = c(NA, 3, NA, 4), VA02_02 = c(NA, 5, NA, 3)), .Names = c("sex", 
"VA_tot_01", "VA_tot_02", "VA01_01", "VA01_02", "VA02_01", "VA02_02"
), row.names = c(NA, -4L), class = "data.frame")

【问题讨论】:

  • 寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。答案可能涉及到重新塑造高、总结,然后重新塑造回宽。

标签: r


【解决方案1】:

考虑到 VAR01 和 VAR02 不重叠,您可以简单地创建另一个变量 VAR_tot_xx,包括两者的原始值。应该是这样的:

new_vars <- function(df) {
  vars <- unique(gsub(
    pattern = ".*_", 
    replacement = "_", 
    x = grep(
      pattern = "_[0-9]{2}$", 
      x = names(df), 
      value = TRUE
    )
  ))
  for (i in vars) {
    new_name <- paste0("VA_tot", i)
    male_name <- paste0("VA01", i)
    female_name <- paste0("VA02", i)
    df[[new_name]] <- NA
    df[[new_name]][!is.na(df[[female_name]])] <- 
      df[[female_name]][!is.na(df[[female_name]])]
    df[[new_name]][!is.na(df[[male_name]])] <- 
      df[[male_name]][!is.na(df[[male_name]])]
  }
  return(df)
}

它可能会比这更漂亮,但这确实有效。

c <- structure(
  list(
    sex = structure(
      c(1L, 2L, 1L, 2L),
      .Label = c("female", "male"),
      class = "factor"
    ),
    VA01_01 = c(1, NA, 2, NA),
    VA01_02 = c(4, NA, 4, NA),
    VA02_01 = c(NA, 3, NA, 4),
    VA02_02 = c(NA, 5, NA, 3)
  ),
  .Names = c("sex", "VA01_01", "VA01_02", "VA02_01", "VA02_02"),
  row.names = c(NA, -4L),
  class = "data.frame"
)
new_vars(c)

#       sex VA01_01 VA01_02 VA02_01 VA02_02 VA_tot_01 VA_tot_02
# 1 female        1       4      NA      NA         1         4
# 2   male       NA      NA       3       5         3         5
# 3 female        2       4      NA      NA         2         4
# 4   male       NA      NA       4       3         4         3

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2018-10-09
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    相关资源
    最近更新 更多