如何合并 R 中的两列?
How can I merge two columns in R?
我的数据框有 2 列,看起来与此类似:
a b
NA NA
yes NA
no NA
yes NA
NA yes
NA no
NA NA
Na yes
我想要的输出是:
ab
NA
yes
no
yes
yes
no
NA
yes
注意:
- 在原来的列中,任何给定行中总会有一个 NA。
- 对于某些行,两列都将为 NA
知道如何获得所需的输出吗?
使用dplyr
你可以把它包裹得非常整齐:
library(dplyr)
df %>% rowwise() %>% summarize(ab = max(a,b, na.rm = T))
dat <- data.frame(a = c(NA, "yes", "no", "yes", NA, NA, NA, NA),
b = c(NA, NA, NA, NA, "yes", "no", NA, "yes"))
require(tidyverse)
dat %>%
rowwise() %>%
mutate(ab = max(a,b, na.rm = TRUE))
使用apply
:
> apply(df, 1, max, na.rm=TRUE)
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
作业:
df$ab <- apply(df, 1, max, na.rm=TRUE)
dplyr::coalesce
> with(dat, dplyr::coalesce(a, b))
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
ifelse
用于基数 R
> with(dat, ifelse(!is.na(a), a, ifelse(!is.na(b), b, NA)))
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
max.col
基数 R
> dat[cbind(1:nrow(dat), max.col(!is.na(dat)))]
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
# Import data: df => data.frame
df <- structure(list(a = c(NA, "yes", "no", "yes", NA, NA, NA, NA),
b = c(NA, NA, NA, NA, "yes", "no", NA, "yes")), class = "data.frame", row.names = c(NA,
-8L))
# Function to coalesce vectors: br_coalesce => function
br_coalesce <- function(...){
# Coalesce vectors or data.frames: res => vector
res <- Reduce(function(x, y) {
x <- replace(x, is.na(x), y[is.na(x)])
},
list(...)
)
# Explicitly define returned vectors: character vector => env
return(res)
}
# Apply function: character vector / data.frame => stdout(console)
br_coalesce(df$a, df$b)
Tidyverse 解决方案:
library(tidyverse)
df %>%
transmute(res = coalesce(a, b))
data.table 解决方案:
library(data.table)
fcoalesce(df$a, df$b)
我的数据框有 2 列,看起来与此类似:
a b
NA NA
yes NA
no NA
yes NA
NA yes
NA no
NA NA
Na yes
我想要的输出是:
ab
NA
yes
no
yes
yes
no
NA
yes
注意:
- 在原来的列中,任何给定行中总会有一个 NA。
- 对于某些行,两列都将为 NA
知道如何获得所需的输出吗?
使用dplyr
你可以把它包裹得非常整齐:
library(dplyr)
df %>% rowwise() %>% summarize(ab = max(a,b, na.rm = T))
dat <- data.frame(a = c(NA, "yes", "no", "yes", NA, NA, NA, NA),
b = c(NA, NA, NA, NA, "yes", "no", NA, "yes"))
require(tidyverse)
dat %>%
rowwise() %>%
mutate(ab = max(a,b, na.rm = TRUE))
使用apply
:
> apply(df, 1, max, na.rm=TRUE)
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
作业:
df$ab <- apply(df, 1, max, na.rm=TRUE)
dplyr::coalesce
> with(dat, dplyr::coalesce(a, b))
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
ifelse
用于基数 R
> with(dat, ifelse(!is.na(a), a, ifelse(!is.na(b), b, NA)))
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
max.col
基数 R
> dat[cbind(1:nrow(dat), max.col(!is.na(dat)))]
[1] NA "yes" "no" "yes" "yes" "no" NA "yes"
# Import data: df => data.frame
df <- structure(list(a = c(NA, "yes", "no", "yes", NA, NA, NA, NA),
b = c(NA, NA, NA, NA, "yes", "no", NA, "yes")), class = "data.frame", row.names = c(NA,
-8L))
# Function to coalesce vectors: br_coalesce => function
br_coalesce <- function(...){
# Coalesce vectors or data.frames: res => vector
res <- Reduce(function(x, y) {
x <- replace(x, is.na(x), y[is.na(x)])
},
list(...)
)
# Explicitly define returned vectors: character vector => env
return(res)
}
# Apply function: character vector / data.frame => stdout(console)
br_coalesce(df$a, df$b)
Tidyverse 解决方案:
library(tidyverse)
df %>%
transmute(res = coalesce(a, b))
data.table 解决方案:
library(data.table)
fcoalesce(df$a, df$b)