R函数根据一组列的值添加多个新列
R function to add multiple new columns based on values from a group of columns
我想找出一种干净的方法来在 R 中一次添加多个对应于多个现有列的新列。如果相应列中的相应单元格是一个,我希望每个新列单元格都是 0 NA 值,如果对应的单元格有任何其他值,则为 1(请参见下面的示例表)。
我已经能够通过首先创建新列,然后使用混乱的 which 函数和循环来完成此操作。我想知道是否有一种干净的方法来执行此操作并一次添加所有具有值的新列。
开始数据
A
B
5
NA
NA
4
应用函数后
A
B
A New
B New
5
NA
1
0
NA
4
0
1
使用 tidyverse
,您可以使用 across
然后将函数应用于所有列(即 everything()
),或者您也可以指定 select 列。然后,我使用 .names
创建两个新列。
library(tidyverse)
df %>%
mutate(across(everything(), ~ifelse(is.na(.x), 0,1), .names = "{col} New"))
输出
A B A New B New
1 5 NA 1 0
2 NA 4 0 1
数据
df <- structure(list(A = c(5L, NA), B = c(NA, 4L)),
class = "data.frame", row.names = c(NA, -2L))
在基础 R 中,
df[paste0(names(df), 'new')] <- +(!is.na(df))
df
# A B Anew Bnew
#1 5 NA 1 0
#2 NA 4 0 1
!is.na(df)
为您提供逻辑值(TRUE
代表 non-NA 值,FALSE
代表 NA
值)。在开头添加 +
会将逻辑值更改为整数值 (TRUE = 1
、FALSE = 0
)。
我想找出一种干净的方法来在 R 中一次添加多个对应于多个现有列的新列。如果相应列中的相应单元格是一个,我希望每个新列单元格都是 0 NA 值,如果对应的单元格有任何其他值,则为 1(请参见下面的示例表)。
我已经能够通过首先创建新列,然后使用混乱的 which 函数和循环来完成此操作。我想知道是否有一种干净的方法来执行此操作并一次添加所有具有值的新列。
开始数据
A | B |
---|---|
5 | NA |
NA | 4 |
应用函数后
A | B | A New | B New |
---|---|---|---|
5 | NA | 1 | 0 |
NA | 4 | 0 | 1 |
使用 tidyverse
,您可以使用 across
然后将函数应用于所有列(即 everything()
),或者您也可以指定 select 列。然后,我使用 .names
创建两个新列。
library(tidyverse)
df %>%
mutate(across(everything(), ~ifelse(is.na(.x), 0,1), .names = "{col} New"))
输出
A B A New B New
1 5 NA 1 0
2 NA 4 0 1
数据
df <- structure(list(A = c(5L, NA), B = c(NA, 4L)),
class = "data.frame", row.names = c(NA, -2L))
在基础 R 中,
df[paste0(names(df), 'new')] <- +(!is.na(df))
df
# A B Anew Bnew
#1 5 NA 1 0
#2 NA 4 0 1
!is.na(df)
为您提供逻辑值(TRUE
代表 non-NA 值,FALSE
代表 NA
值)。在开头添加 +
会将逻辑值更改为整数值 (TRUE = 1
、FALSE = 0
)。