通过在列名中查找对应值来创建列

问题描述 投票:0回答:1

我的问题与以下post

非常相似

在我的数据库中,我有多个列,其中包含 M0、M6、M12... 等值。我有一些列的名称为 M0、M6、M12...

我想将包含 M0... 的第一列替换为该列中对应的值

作为一个理解示例,我有:

df <- data.frame(time=c("M0","M12","M0","M0","M12"),
                 M0=c(1,2,4,5,1),
                 M12=c(8,5,9,2,1))
df
  time M0 M12
1   M0  1   8
2  M12  2   5
3   M0  4   9
4   M0  5   2
5  M12  1   1

如前所述,我发现一篇文章有有趣的答案,特别是使用

cur_data()

df2 <- df %>%
  rowwise %>%
  mutate(newd = cur_data()[[cur_data()$time]]) %>%
  ungroup 
df2
# A tibble: 5 × 4
  time     M0   M12  newd
  <chr> <dbl> <dbl> <dbl>
1 M0        1     8     1
2 M12       2     5     5
3 M0        4     9     4
4 M0        5     2     5
5 M12       1     1     1

它有效,但需要很长时间,而且显然

cur_data
已被弃用,取而代之的是
pick()
,我不知道如何替换它以使其工作

任何对此的建议将不胜感激!

r dplyr
1个回答
0
投票

您可以在基础 R 中使用子集化:

df$newd <- df[-1][cbind(seq_len(nrow(df)), match(df$time, names(df)[-1]))]
df
  time M0 M12 newd
1   M0  1   8    1
2  M12  2   5    5
3   M0  4   9    4
4   M0  5   2    5
5  M12  1   1    1
© www.soinside.com 2019 - 2024. All rights reserved.