簡體   English   中英

根據 R 中其他三個列的值創建新列

[英]Create new column based on values from three other columns in R

我有一個 dataframe:

df <- data.frame('a'=c(1,NA,3,NA,NA), 'b'=c(NA,NA,NA,4,50), 'c'=c(NA,5,NA,NA,NA))
df
   a  b  c
1  1 NA NA
2 NA NA  5
3  3 NA NA
4 NA  4 NA
5 NA 50 NA

我需要創建一個新列 d,它只組合沒有 NA 的值:

  a  b  c  d
1  1 NA NA 1
2 NA NA  5 5
3  3 NA NA 3
4 NA  4 NA 4
5 NA 50 NA 50

@r2evans 在評論部分的解決方案的補充:

我們可以使用來自coalesce dplyr的合並:

df %>% 
  mutate(d = coalesce(a, b, c))
   a  b  c  d
1  1 NA NA  1
2 NA NA  5  5
3  3 NA NA  3
4 NA  4 NA  4
5 NA 50 NA 50

或者

我們可以使用來自tidyr package 的unitena.rm參數:

library(tidyr)
library(dplyr)

df %>% 
  unite(d, a:c, na.rm = TRUE, remove = FALSE)
   d  a  b  c
1  1  1 NA NA
2  5 NA NA  5
3  3  3 NA NA
4  4 NA  4 NA
5 50 NA 50 NA

您可以在不使用任何庫的情況下簡單地執行以下操作:

df$d <- apply(df, MARGIN=1, function(x) x[!is.na(x)])
   a  b  c  d
1  1 NA NA  1
2 NA NA  5  5
3  3 NA NA  3
4 NA  4 NA  4
5 NA 50 NA 50

它的工作原理是: function, function(x) x[.is.na(x)]將向量作為輸入並從中返回非 na 元素,應用於每一行 (margin=1)。

base R中的向量化選項是max.col以獲取非 NA 的列索引, cbind與行序列並提取元素

df$d <- df[cbind(seq_len(nrow(df)), max.col(!is.na(df)))]

-輸出

> df
   a  b  c  d
1  1 NA NA  1
2 NA NA  5  5
3  3 NA NA  3
4 NA  4 NA  4
5 NA 50 NA 50

另一種選擇是使用來自fcoalescedata.table ,它采用 dataframe 並允許您放棄必須添加列名。

library(data.table)

df$d <- fcoalesce(df)

Output

   a  b  c  d
1  1 NA NA  1
2 NA NA  5  5
3  3 NA NA  3
4 NA  4 NA  4
5 NA 50 NA 50

或者我們可以使用do.callpmax

df$d <- do.call(pmax, c(df, list(na.rm=TRUE)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM