R 中多列的 If 语句

If statements for a multiple columns in R

提问人:T K 提问时间:10/8/2022 最后编辑:T K 更新时间:10/8/2022 访问量:27

问:

data <- data.frame(id=c(1,2,3,4,5,6,7),
                  q1=c(3,4,5,2,1,2,4),
                   q2=c(3,4,4,5,4,3,2),
                   q3=c(2,3,2,3,1,2,3),
                   q4=c(3,4,4,4,4,5,5))

对于这些 q1-q4,我想写一个语句,其中说如果 q1 = 1,则生成一个 q1_1 =1 ;如果 q1=2,则生成 q1_2 = 2;如果 q1=3,则生成 q1_3=3;如果 Q1=4,则生成 q1_4=4,如果 Q5=5,则为此数据集中的所有问题生成 q1_5=5。我知道我必须做某种循环,然后可能是一个 if 语句,但我根本不熟悉循环。

我希望得到的输出看起来像(但所有问题都有更多列)


  id q1 q2 q3 q4 q1_1 q1_2 q1_3 q1_4 q1_5
1  1  3  3  2  3   NA   NA    3   NA   NA
2  2  4  4  3  4   NA   NA   NA    4   NA
3  3  5  4  2  4   NA   NA   NA   NA    5
4  4  2  5  3  4   NA    2   NA   NA   NA
5  5  1  4  1  4    1   NA   NA   NA   NA
6  6  2  3  2  5   NA    2   NA   NA   NA
7  7  4  2  3  5    4   NA   NA    4   NA


任何帮助都是值得赞赏的,谢谢!

R 循环 if-statement 数据操作

评论


答:

1赞 AndS. 10/8/2022 #1

无需循环。先做多,再做宽,然后联接原始数据。

library(tidyverse)

data <- tibble(id=c(1,2,3,4,5,6,7),
                  q1=c(3,4,5,2,1,2,4),
                   q2=c(3,4,4,5,4,3,2),
                   q3=c(2,3,2,3,1,2,3),
                   q4=c(3,4,4,4,4,5,5))

data |>
  pivot_longer(-id) |>
  mutate(name = paste(name, value, sep = "_")) |>
  pivot_wider() |>
  (\(d) left_join(data, d, by = "id"))()
#> # A tibble: 7 x 20
#>      id    q1    q2    q3    q4  q1_3  q2_3  q3_2  q4_3  q1_4  q2_4  q3_3  q4_4
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1     3     3     2     3     3     3     2     3    NA    NA    NA    NA
#> 2     2     4     4     3     4    NA    NA    NA    NA     4     4     3     4
#> 3     3     5     4     2     4    NA    NA     2    NA    NA     4    NA     4
#> 4     4     2     5     3     4    NA    NA    NA    NA    NA    NA     3     4
#> 5     5     1     4     1     4    NA    NA    NA    NA    NA     4    NA     4
#> 6     6     2     3     2     5    NA     3     2    NA    NA    NA    NA    NA
#> 7     7     4     2     3     5    NA    NA    NA    NA     4    NA     3    NA
#> # ... with 7 more variables: q1_5 <dbl>, q1_2 <dbl>, q2_5 <dbl>, q1_1 <dbl>,
#> #   q3_1 <dbl>, q4_5 <dbl>, q2_2 <dbl>