![](/img/trans.png)
[英]R: Efficient way to replace column values based on strings (maybe with case_when or some other form of mutate)?
[英]Creating a new column based on values obtained from different column, using mutate() and case_when function in R
我是一个对 R 比较陌生的学生,并且从浏览这里学到了很多东西,我最近一直被困在一些事情上,经过几个小时的尝试仍然无法弄清楚该怎么做。 让我们提出以下数据集:
ID Y1 Y2 Y3 Y4
1 0 0 1 1
2 0 0 0 0
3 不适用 不适用 不适用
我想创建一个新列,根据以下条件填充它:
因此,使用上面的示例,我想得到以下信息:
ID Y1 Y2 Y3 Y4 结果
1 0 0 1 1 1
2 0 0 0 0 0
3 NA NA NA NA NA
但是,我尝试的代码:
Data2 <- Data %>% mutate(Outcome = case_when(
Data$Y1 == "na" &
Data$Y2 == "na" &
Data$Y3 == "na" &
Data$Y4 == "na" ~ "na")) %>%
mutate(Outcome = case_when(Data$Y1 == 1 ~ "1",
Data$Y2 == 1 ~ "1",
Data$Y3 == 1 ~ "1",
Data$Y4 == 1 ~ "1",
TRUE ~ "No"))
将返回:
ID Y1 Y2 Y3 Y4 结果
1 0 0 1 1 1
2 0 0 0 0 0
3 不适用 不适用 不适用 0
这似乎忽略了条件 3,如果它只包含 na,则返回 na。
任何关于我做错了什么的指针将不胜感激。
请原谅格式,我不确定如何使它更漂亮,因为这是我第一次在这里提出问题。
提前谢谢了!
[编辑] 感谢 Shah,我注意到可能会造成混淆,对此我深表歉意。 我需要澄清一下,这只是数据集的一部分,以便理解这一点。 我正在处理一个包含更多列的大数据集,其中一些也有数值。
检查每一列( Y1
, Y2
, Y3
等)太乏味且不可扩展。 如果你有 100 列需要它,这将成为一个大问题。
如示例所示,您希望忽略第一列 ( ID
) 并在计算中包含所有其他列,您可以执行以下操作。 答案中的-1
是忽略第一列ID
。
也可以使用is.na
来比较NA
值。
#Count number of non-NA values, this is used later to change the rows
#with all NA values to NA in outcome
non_NA <- rowSums(!is.na(df[-1]))
#Assign 1 if the count of 1 is greater than 0 in a row
df$Outcome <- as.integer(rowSums(df[-1], na.rm = TRUE) > 0)
#turn the outcome variable to NA for rows which has all NA values.
df$Outcome[non_NA == 0] <- NA
df
# ID Y1 Y2 Y3 Y4 Outcome
#1 1 0 0 1 1 1
#2 2 0 0 0 0 0
#3 3 NA NA NA NA NA
数据
df <- structure(list(ID = 1:3, Y1 = c(0L, 0L, NA), Y2 = c(0L, 0L, NA
), Y3 = c(1L, 0L, NA), Y4 = c(1L, 0L, NA)),
class = "data.frame", row.names = c(NA, -3L))
您可以使用dplyr
rowwise
函数尝试此操作,该函数分别处理每一行
library(dplyr)
df |> rowwise() |>
mutate(Outcome = case_when(any(c_across(Y1:Y4) == 1) ~ "1" ,
all(is.na(c_across(Y1:Y4))) ~ NA_character_ , TRUE ~ "0"))
# A tibble: 3 × 6
# Rowwise:
ID Y1 Y2 Y3 Y4 Outcome
<int> <int> <int> <int> <int> <chr>
1 1 0 0 1 1 1
2 2 0 0 0 0 0
3 3 NA NA NA NA NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.