如果为 TRUE,则为变量名称

IF TRUE then Variable name

提问人:mar355 提问时间:3/2/2022 最后编辑:Philmar355 更新时间:3/2/2022 访问量:451

问:

我有一系列 TRUE 和 FALSE 变量代表搜索结果,例如:手机、刀、钱等。我的目标是更改变量名称的值 TRUE。请注意,我想对 15 个或更多变量执行此操作。

df <- data.frame(cellphone = c(TRUE, TRUE, FALSE, TRUE, FALSE),
                 money = c(FALSE, FALSE, FALSE, TRUE, FALSE),
                 knife = c(TRUE,TRUE,FALSE, FALSE, FALSE),
                 whatIneed = c("cellphone", "cellphone", "", "cellphone",""))

  cellphone money knife whatIneed
1      TRUE FALSE  TRUE cellphone
2      TRUE FALSE  TRUE cellphone
3     FALSE FALSE FALSE          
4      TRUE  TRUE FALSE cellphone
5     FALSE FALSE FALSE       
r if 语句 布尔逻辑

评论

1赞 Maël 3/2/2022
一个简单的语句也可以完成这项工作:ifelseifelse(df$cellphone == T, "cellphone", "")
0赞 mar355 3/2/2022
感谢您的回复。我有很多变量,想找到一种最快的方法,也许是一个循环。
0赞 Maël 3/2/2022
@akrun的答案是我认为最简单的方法。

答:

3赞 akrun 3/2/2022 #1

在 中,一个选项是循环遍历逻辑行列的子集,根据逻辑向量获取第一个列名base R

df$whatIneed <- apply(df[1:3], 1, function(x) names(x)[x][1])
df$whatIneed
[1] "cellphone" "cellphone" NA          "cellphone" NA     

如果我们想在每列上单独执行此操作

library(dplyr)
df %>%
    mutate(across(where(is.logical),
      ~ case_when(.x ~ cur_column()), .names = "{.col}_name"))

-输出

cellphone money knife whatIneed cellphone_name money_name knife_name
1      TRUE FALSE  TRUE cellphone      cellphone       <NA>      knife
2      TRUE FALSE  TRUE cellphone      cellphone       <NA>      knife
3     FALSE FALSE FALSE                     <NA>       <NA>       <NA>
4      TRUE  TRUE FALSE cellphone      cellphone      money       <NA>
5     FALSE FALSE FALSE                     <NA>       <NA>       <NA>

评论

0赞 mar355 3/2/2022
嗨,阿伦,我需要对所有变量执行此操作。如果变量的值为 TRUE,则返回变量名称。
0赞 mar355 3/2/2022
哇,太完美了!第一个子句 (where(is.logical)) 过滤所需的列,对吗?如果还有其他不相关的逻辑/布尔变量我不想包含怎么办?谢谢!!!
0赞 akrun 3/2/2022
@MarvinAliaga,您可以使用任何 select-helpers 来选择列。在这里,很明显你想把它应用到逻辑列上。假设您要选择特定用途,或者它是否在一个范围内等across(c(cellphone, money), ~ ..across(c(cellphone:knife), ~
1赞 mar355 3/2/2022
完善!再次感谢!