提问人:Heiko Westerburg 提问时间:7/19/2023 最后编辑:Heiko Westerburg 更新时间:7/19/2023 访问量:59
是否有 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?
问:
数据结构示例:
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赞
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()
true
false
0赞
Phil
7/19/2023
您收到此错误是因为您的评级变量采用字符格式。这是故意的吗?
0赞
Heiko Westerburg
7/19/2023
不,不是故意的。更改了它,它起作用了 - 非常感谢!
0赞
Darren Tsai
7/19/2023
如果有更多的级别,这种方法将是硬编码和繁琐的。可能还有其他灵活的方法,不依赖于 的字面级别。dv
dv
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
评论
pivot_wider
score