【问题标题】:Create a new variable for each time point in R为R中的每个时间点创建一个新变量
【发布时间】:2021-09-07 20:20:18
【问题描述】:

我有一个广泛的数据集,其中包含在不同时间点测量的变量。每个变量在数据集中都有很多列,列末尾的数字表示收集数据的时间点(例如 a.1、a.2、a.3 等)。我想为每个时间点创建一个新变量,对相同的变量使用相同的公式。我怎样才能通过只对每个时间点应用一个公式来编写代码,而不是像下面的示例那样为每个时间点重复相同的代码?

df$a.1 <- (df$b.1 + df$c.1)/2

df$a.2 <- (df$b.2 + df$c.2)/2

df$a.3 <- (df$b.3 + df$c.3)/2

df$a.4 <- (df$b.4 + df$c.4)/2

谢谢

【问题讨论】:

    标签: r apply longitudinal


    【解决方案1】:

    我们可以对b 列进行子集化,获取相应的c 列并取平均值并分配回新列,paste 以及+/ 是矢量化的

    df[paste0("a.", 1:4)] <- (df[paste0("b.", 1:4)] + df[paste0("c.", 1:4)])/2
    

    across 也可以通过循环遍历“b”列,然后 get 对应的“c”列并更改 .names 中的名称以创建新列

    library(dplyr)
    library(stringr)
    df <- df %>%
          mutate(across(starts_with('b.'), ~ 
                    (. + get(str_replace(cur_column(), 'b', 'c')))/2,
                  .names = "{str_replace(.col, 'b', 'a')}"))
    

    【讨论】:

    • 感谢阿克伦!有效。然后我尝试对另一个新变量(“e”)应用相同的过程,我想从 4 个变量(“a”、“b”、“c”和“d”)的平均值而不是 2 个(“ a" 和 "b") 变量,但我无法使其工作。这是我尝试过的代码,但显然我有问题... df % mutate(across(starts_with('a.'), ~ (. + get(str_replace(cur_column(), 'a' , 'b', 'c', 'd')))/4, .names = "{str_replace(.col, 'a', 'e')}"))
    • @Myriam 仅当您有两种情况时,第二个代码才有效。如果您有更多案例,则需要多个 str_replaceget(str_replace(cur_column(), 'b', 'c')) + get(str_replace(cur_column(), 'b', 'd')) + .... Instead it may be easier in the first case i..e just subset for c', 'd', 'e'与paste
    • @Myriam 即您的代码 str_replace(cur_column(), 'a', 'b', 'c', 'd') 不正确,因为 str_replace 的用法是 str_replace(string, pattern, replacement),并且当您提供的参数多于函数中的参数时,它会中断
    • @Myriam tidyverse 中的一个选项也可以使用pivot_longer 重塑为“长”格式,即df %&gt;% mutate(rn = row_number()) %&gt;% pivot_longer(cols = -rn, names_to = c(".value", "grp"), names_sep = "\\.") %&gt;% mutate(a = (b + c+d + e)/4) %&gt;% pivot_wider(names_from = grp, values_from = c(a, b, c, d, e)) %&gt;% select(-rn)
    • @Myriam 请注意,我没有在 pivot_longer 中测试上述代码。其中可能有一些错误。对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 2011-10-22
    • 2017-01-07
    • 2021-06-16
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多