如果我的資料框 df 中有以下資料結構:
a b c d
1 2 3 4
NA NA 1 2
NA 1 2 NA
NA NA NA 1
如何創建一個變數來告訴我,哪些變數是第一個沒有缺失值的變數,例如:
a b c d var
1 2 3 4 a
NA NA 1 2 c
NA 1 2 NA b
NA NA NA 1 d
由于資料集的大小和更改變數的順序,我需要代碼使用變數名而不是列號。
我試過了:
df <- df %>% mutate(var = coalesce(deparse(substitute(a)), deparse(substitute(b)), deparse(substitute(c)), deparse(substitute(d))))
和
df <- df %>% mutate(var = deparse(substitute(do.call(coalesce, across(c(a, b, c, d))))))
試圖實施這種方法。我得到了從中提取變數名稱字串的代碼: 如何將變數(物件)名稱轉換為字串
uj5u.com熱心網友回復:
我們可以使用max.col,即
names(df)[max.col(!is.na(df), ties.method = 'first')]
#[1] "a" "c" "b" "d"
通過dplyr,
library(dplyr)
df %>%
mutate(var = names(.)[max.col(!is.na(.), ties.method = 'first')])
a b c d var
1 1 2 3 4 a
2 NA NA 1 2 c
3 NA 1 2 NA b
4 NA NA NA 1 d
您可以指定變數
df %>%
mutate(var = names(.[c('a', 'b')])[max.col(!is.na(.[c('a', 'b')]), ties.method = 'first')])
a b c d var
1 1 2 3 4 a
2 NA NA 1 2 a
3 NA 1 2 NA b
4 NA NA NA 1 a
您還可以通過更改變數的順序select(),即
df %>%
select(c, d, b, a) %>%
mutate(new = names(.)[max.col(!is.na(.), ties.method = 'first')])
c d b a new
1 3 4 2 1 c
2 1 2 NA NA c
3 2 NA 1 NA c
4 NA 1 NA NA d
您也可以select()再次呼叫以恢復列的原始順序,但保持先前順序的結果,即
df %>%
select(c, d, b, a) %>%
mutate(new = names(.)[max.col(!is.na(.), ties.method = 'first')]) %>%
select(names(df), new)
a b c d new
1 1 2 3 4 c
2 NA NA 1 2 c
3 NA 1 2 NA c
4 NA NA NA 1 d
最后要維護所有變數,可以加入原始資料框,即
df %>%
select(c, d, b) %>%
mutate(new = names(.)[max.col(!is.na(.), ties.method = 'first')]) %>%
left_join(df) %>%
select(names(df), new)
Joining, by = c("c", "d", "b")
a b c d new
1 1 2 3 4 c
2 NA NA 1 2 c
3 NA 1 2 NA c
4 NA NA NA 1 d
uj5u.com熱心網友回復:
你可以做
df %>% mutate(var = apply(., 1, \(x) names(which(!is.na(x)))[1]))
#> a b c d var
#> 1 1 2 3 4 a
#> 2 NA NA 1 2 c
#> 3 NA 1 2 NA b
#> 4 NA NA NA 1 d
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/479913.html
上一篇:C中檔案路徑中的檔案名變數
