将多个 columns/variables 组合成一个列
Combining multiple columns/variables into a single column
我有以下问题(我想有一个简单的答案,但我想不通...)。
我想将多列合并为一列。我有 3 个变量,有回答变量 1 的案例、回答变量 2 的案例、回答变量 3 的案例和回答 none 个变量的案例。
现在,我想将它们全部合并到一个变量中,看起来像列 vx
:
Ideal result:
v1 v2 v3 vx
1 1 NA NA 1
2 3 NA NA 3
3 6 NA NA 6
4 NA 5 NA 5
5 NA 1 NA 1
6 NA 3 NA 3
7 NA NA 4 4
8 NA NA 2 2
9 NA NA 1 1
10 NA NA NA NA
v1 <- c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 <- c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 <- c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)
df <- data.frame(v1, v2, v3)
我用 df$vx <- paste(df$v1, df$v2, df$v3)
尝试过,但我得到以下结果:
My result:
v1 v2 v3 vx
1 1 NA NA 1 NA NA
2 3 NA NA 3 NA NA
3 6 NA NA 6 NA NA
4 NA 5 NA NA 5 NA
5 NA 1 NA NA 1 NA
6 NA 3 NA NA 3 NA
7 NA NA 4 NA NA 4
8 NA NA 2 NA NA 2
9 NA NA 1 NA NA 1
10 NA NA NA NA NA NA
有人能告诉我如何在没有 NAs
的情况下得到像上面那样的结果(理想结果)(除非只有 NAs
那么我想只有一个 NA
在列 vx
)
我希望我说清楚我的问题是什么。
非常感谢!
这就是 dplyr::coalesce
的用途:
library(dplyr)
df$v4 <- coalesce(!!!df)
#Also works:
df %>%
mutate(v4 = coalesce(v1, v2, v3))
输出
v1 v2 v3 v4
1 1 NA NA 1
2 3 NA NA 3
3 6 NA NA 6
4 NA 5 NA 5
5 NA 1 NA 1
6 NA 3 NA 3
7 NA NA 4 4
8 NA NA 2 2
9 NA NA 1 1
10 NA NA NA NA
使用apply()
# Your data.
v1 = c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 = c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 = c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)
df = data.frame(v1, v2, v3)
df
# Solution: writing a function to be passed in apply().
useful.function = function(x)
{
# The input "x" is a row of a dataframe.
# If all the values are NA, return NA.
if(sum(!is.na(x)) == 0)
return(NA)
# Otherwise, return the non-NA value.
return(x[!is.na(x)])
}
df$vx = apply(df, MARGIN = 1, useful.function)
df
显然,其他解决方案可能更快并且需要更少的编码(因为那些依赖于 dplyr
包的解决方案,由@Maël 发布)。但是,我真的建议您自信地使用 apply()
和同一系列的其他函数(参见 lapply()
和 sapply()
),因为它们非常灵活(有时您可能不请注意某个功能或包的存在)。
在基础 R 中使用 max.col
-
df$vx <- df[cbind(1:nrow(df), max.col(!is.na(df)))]
df
# v1 v2 v3 vx
#1 1 NA NA 1
#2 3 NA NA 3
#3 6 NA NA 6
#4 NA 5 NA 5
#5 NA 1 NA 1
#6 NA 3 NA 3
#7 NA NA 4 4
#8 NA NA 2 2
#9 NA NA 1 1
#10 NA NA NA NA
max.col
returns 每行最大值的索引。使用 !is.na(df)
我们将在每一行中获得 TRUE
值的索引,因为 TRUE > FALSE
。我们用 cbind
创建一个矩阵以从每一行中提取最大值。
我有以下问题(我想有一个简单的答案,但我想不通...)。
我想将多列合并为一列。我有 3 个变量,有回答变量 1 的案例、回答变量 2 的案例、回答变量 3 的案例和回答 none 个变量的案例。
现在,我想将它们全部合并到一个变量中,看起来像列 vx
:
Ideal result:
v1 v2 v3 vx
1 1 NA NA 1
2 3 NA NA 3
3 6 NA NA 6
4 NA 5 NA 5
5 NA 1 NA 1
6 NA 3 NA 3
7 NA NA 4 4
8 NA NA 2 2
9 NA NA 1 1
10 NA NA NA NA
v1 <- c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 <- c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 <- c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)
df <- data.frame(v1, v2, v3)
我用 df$vx <- paste(df$v1, df$v2, df$v3)
尝试过,但我得到以下结果:
My result:
v1 v2 v3 vx
1 1 NA NA 1 NA NA
2 3 NA NA 3 NA NA
3 6 NA NA 6 NA NA
4 NA 5 NA NA 5 NA
5 NA 1 NA NA 1 NA
6 NA 3 NA NA 3 NA
7 NA NA 4 NA NA 4
8 NA NA 2 NA NA 2
9 NA NA 1 NA NA 1
10 NA NA NA NA NA NA
有人能告诉我如何在没有 NAs
的情况下得到像上面那样的结果(理想结果)(除非只有 NAs
那么我想只有一个 NA
在列 vx
)
我希望我说清楚我的问题是什么。
非常感谢!
这就是 dplyr::coalesce
的用途:
library(dplyr)
df$v4 <- coalesce(!!!df)
#Also works:
df %>%
mutate(v4 = coalesce(v1, v2, v3))
输出
v1 v2 v3 v4
1 1 NA NA 1
2 3 NA NA 3
3 6 NA NA 6
4 NA 5 NA 5
5 NA 1 NA 1
6 NA 3 NA 3
7 NA NA 4 4
8 NA NA 2 2
9 NA NA 1 1
10 NA NA NA NA
使用apply()
# Your data.
v1 = c(1, 3, 6, NA, NA, NA, NA, NA, NA, NA)
v2 = c(NA, NA, NA, 5, 1, 3, NA, NA, NA, NA)
v3 = c(NA, NA, NA, NA, NA, NA, 4, 2, 1, NA)
df = data.frame(v1, v2, v3)
df
# Solution: writing a function to be passed in apply().
useful.function = function(x)
{
# The input "x" is a row of a dataframe.
# If all the values are NA, return NA.
if(sum(!is.na(x)) == 0)
return(NA)
# Otherwise, return the non-NA value.
return(x[!is.na(x)])
}
df$vx = apply(df, MARGIN = 1, useful.function)
df
显然,其他解决方案可能更快并且需要更少的编码(因为那些依赖于 dplyr
包的解决方案,由@Maël 发布)。但是,我真的建议您自信地使用 apply()
和同一系列的其他函数(参见 lapply()
和 sapply()
),因为它们非常灵活(有时您可能不请注意某个功能或包的存在)。
在基础 R 中使用 max.col
-
df$vx <- df[cbind(1:nrow(df), max.col(!is.na(df)))]
df
# v1 v2 v3 vx
#1 1 NA NA 1
#2 3 NA NA 3
#3 6 NA NA 6
#4 NA 5 NA 5
#5 NA 1 NA 1
#6 NA 3 NA 3
#7 NA NA 4 4
#8 NA NA 2 2
#9 NA NA 1 1
#10 NA NA NA NA
max.col
returns 每行最大值的索引。使用 !is.na(df)
我们将在每一行中获得 TRUE
值的索引,因为 TRUE > FALSE
。我们用 cbind
创建一个矩阵以从每一行中提取最大值。