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

Is there an R function to merge two variables into a new one, so that a new cell is written only if a certain entry of another variable is given?

提问人:Heiko Westerburg 提问时间:7/19/2023 最后编辑:Heiko Westerburg 更新时间:7/19/2023 访问量:59

问:

数据结构示例:

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 

也没有工作,因为它不是每三个粘贴一次,而是为新创建的变量粘贴每个“分数”值,因此会出现滞后。

非常感谢您的帮助!

R 变量 合并

评论

1赞 jpsmith 7/19/2023
你好!你能编辑你的问题以使其可重现吗?图像中的数据结构不是很有帮助。编辑您的问题以包含示例数据(在代码中)将在最快的时间内为您提供最好的帮助。祝你好运!
0赞 Stewart Macdonald 7/19/2023
您的数据集中是否有另一列/变量将这三个评级链接在一起(即参与者 ID)?如果是这样,您可以使用从长格式转换为宽格式。pivot_wider
0赞 Onyambu 7/19/2023
列在哪里?你想要什么输出?score
1赞 Heiko Westerburg 7/19/2023
@jpsmith代码中添加了示例数据,感谢您的评论!:-)
1赞 Heiko Westerburg 7/19/2023
@StewartMacdonald有一个参与者 ID,但在转换为宽格式时,目标变量将另存为列表,其中包含一个写入条目和两个空条目 (c(100,NA,NA))

答:

2赞 Onyambu 7/19/2023 #1

您可以执行以下操作:

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
1赞 Phil 7/19/2023 #2
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

评论

0赞 Heiko Westerburg 7/19/2023
谢谢!试过了,它说错误:i 在参数中:。由以下错误引起: !不能组合<字符>和<整数>。回溯: 1. dplyr::mutate(...)8. dplyr::if_else(dv == “Unt”, rating, NA_integer_)mutate()unt = if_else(dv == "Unt", rating, NA_integer_)if_else()truefalse
0赞 Phil 7/19/2023
您收到此错误是因为您的评级变量采用字符格式。这是故意的吗?
0赞 Heiko Westerburg 7/19/2023
不,不是故意的。更改了它,它起作用了 - 非常感谢!
0赞 Darren Tsai 7/19/2023
如果有更多的级别,这种方法将是硬编码和繁琐的。可能还有其他灵活的方法,不依赖于 的字面级别。dvdv
0赞 AndS. 7/19/2023 #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