我有一個包含多個試驗的大型資料框。我想要一個新的專欄,在這三個專欄中進行最好的嘗試。它們是字串,應按好、公平和壞排序。
df <- data.frame(id = c(1:5),
filler = c("You", "can", "ignore", "this", "one"),
trial1 = c("good", NA, "good", "fair", NA),
trial2 = c("bad", "bad", "fair", "NA", NA),
trial3 = c("bad", "bad", "bad", "bad", NA))
在此示例中,這意味著對于新列和每個 ID:good、bad、good、fair、NA
uj5u.com熱心網友回復:
我們可以使用rowwise回圈遍歷行,將列轉換為自定義順序中指定的列,并starts_with在factor洗掉級別后提取列( )levelsfirstlevelsdroplevels
library(dplyr)
df <- df %>%
rowwise %>%
mutate(new = first(levels(droplevels(factor(c_across(starts_with('trial')),
levels = c('good', 'fair', 'bad')))))) %>%
ungroup
-輸出
df
# A tibble: 5 × 6
id filler trial1 trial2 trial3 new
<int> <chr> <chr> <chr> <chr> <chr>
1 1 You good bad bad good
2 2 can <NA> bad bad bad
3 3 ignore good fair bad good
4 4 this fair NA bad fair
5 5 one <NA> <NA> <NA> <NA>
或使用 pmap
library(purrr)
df %>%
mutate(new = pmap_chr(across(starts_with('trial')),
~ .x[na.omit(match(c('good', 'fair', 'bad'), .x))[1]]))
id filler trial1 trial2 trial3 new
1 1 You good bad bad good
2 2 can <NA> bad bad <NA>
3 3 ignore good fair bad good
4 4 this fair NA bad fair
5 5 one <NA> <NA> <NA> <NA>
或使用 collapse
library(collapse)
df$new <- dapply(gvr(df, 'trial\\d '), MARGIN = 1,
FUN = \(x) x[na.omit(match(c('good', 'fair', 'bad'), x))[1]])
uj5u.com熱心網友回復:
這是一種通過旋轉結合case_when陳述句來解決它的方法:
library(tidyr)
library(dplyr)
df %>%
pivot_longer(starts_with("trial")) %>%
group_by(id) %>%
mutate(new = case_when("good" %in% value ~ "good",
"fair" %in% value &
!("good" %in% value) ~ "fair",
"bad" %in% value &
!("fair" %in% value) &
!("good" %in% value) ~ "bad",
TRUE ~ NA_character_)) %>%
pivot_wider() %>%
ungroup()
id filler new trial1 trial2 trial3
<int> <chr> <chr> <chr> <chr> <chr>
1 1 You good good bad bad
2 2 can bad NA bad bad
3 3 ignore good good fair bad
4 4 this fair fair NA bad
5 5 one NA NA NA NA
uj5u.com熱心網友回復:
這是執行此操作的基本 R 方法-
cols <- grep('trial', names(df))
df[cols] <- lapply(df[cols], factor, c('bad', 'fair', 'good'), ordered = TRUE)
df$out <- do.call(pmax, c(df[cols], na.rm = TRUE))
df
# id filler trial1 trial2 trial3 out
#1 1 You good bad bad good
#2 2 can <NA> bad bad bad
#3 3 ignore good fair bad good
#4 4 this fair <NA> bad fair
#5 5 one <NA> <NA> <NA> <NA>
我們首先將trial列更改為有序因子,然后按行取最大值以獲得每行中的最大值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/419360.html
標籤:
下一篇:Dplyr變異語法
