代码之家  ›  专栏  ›  技术社区  ›  Heiko Westerburg

是否有一个R函数可以将两个变量合并为一个新的变量,从而只有在给定另一个变量的某个条目时才能写入新的单元格?

  •  1
  • Heiko Westerburg  · 技术社区  · 3 年前

    示例数据结构:

    dats_long <- data.frame (dv  = c("Unt", "Dis", "Emp"),
                      rating = c(100, 53, 99),
                      unt = c(NA, NA, NA),
                      dis = c(NA, NA, NA),
                      emp = c(NA, NA, NA))
    

    每个参与者有三个测量(长格式),其中从一个小插曲调查中提取了三个DV,得分存储在一个单独的变量中(“评级”)。

    有没有一种方法可以创建三个新的独立DV列(在示例数据结构中为“unt”、“dis”、“emp”,仍为NA),只编写相应的评级?

    目标输出:

    dats_long <- data.frame (dv  = c("Unt", "Dis", "Emp"),
                      rating = c(100, 53, 99),
                      unt = c(100, NA, NA),
                      dis = c(NA, 53, NA),
                      emp = c(NA, NA, 99))
    

    尝试了以下内容(例如“dis”),但没有写任何内容

    dats_long %>% mutate(dis = case_when( dv == "Dis" ~ rating ))

    dats_long$dis[dats_long$dv == "Dis"] <- dats_long$rating 
    

    也不起作用,因为它只是为新创建的变量粘贴“分数”的每个值,而不是每三分之一,因此出现了滞后。

    非常感谢你的帮助!

    2 回复  |  直到 3 年前
        1
  •  2
  •   Onyambu    3 年前

    你可以做到:

    cbind(dats_long[1:2], model.matrix(~dv:rating+0, dats_long))
    
       dv rating dvDis:rating dvEmp:rating dvUnt:rating
    1 Unt    100            0            0          100
    2 Dis     53           53            0            0
    3 Emp     99            0           99            0
    

    library(tidyverse)
    dats_long[1:2]%>%
       mutate(name = dv, value = rating) %>%
       pivot_wider()
    
    # A tibble: 3 × 5
      dv    rating   Unt   Dis   Emp
      <chr>  <dbl> <dbl> <dbl> <dbl>
    1 Unt      100   100    NA    NA
    2 Dis       53    NA    53    NA
    3 Emp       99    NA    NA    99
    
        2
  •  1
  •   Phil    3 年前
    mutate(dats_long,
          unt = if_else(dv == "Unt", rating, NA_integer_), 
          dis = if_else(dv == "Dis", rating, NA_integer_), 
          emp = if_else(dv == "Emp", rating, NA_integer_))
    
       dv rating unt dis emp
    1 Unt    100 100  NA  NA
    2 Dis     53  NA  53  NA
    3 Emp     99  NA  NA  99
    
        3
  •  0
  •   AndS.    3 年前

    这个怎么样?

    library(tidyverse)
    
    dats_long |>
      mutate(across(unt:emp, 
                    \(x) tolower(dv) %in% cur_column() |> ifelse(rating, NA)))
    #>    dv rating unt dis emp
    #> 1 Unt    100 100  NA  NA
    #> 2 Dis     53  NA  53  NA
    #> 3 Emp     99  NA  NA  99