Объединение нескольких векторов в один в r? - PullRequest
0 голосов
/ 26 мая 2020
• 1000 т.е.

Осложнения (лихорадка, прочее, ноль, транс) Степень (3,3, ноль, 1)

Ответы [ 3 ]

2 голосов
/ 26 мая 2020

В base R мы можем использовать max.col

Grade <- max.col(df1 != "nil") * NA^!rowSums(df1 != "nil")
Complications <- df1[cbind(seq_len(nrow(df1)), Grade)]
setNames(replace(Grade, is.na(Grade), "nil"), 
         replace(Complications, is.na(Complications), "nil"))
#   fever other   nil trans 
#     "3"   "3" "nil"   "1" 

данные

df1 <- structure(list(G1 = c("nil", "nil", "nil", "trans"), G2 = c("nil", 
"nil", "nil", "nil"), G3 = c("fever", "other", "nil", "nil")), 
class = "data.frame", row.names = c("1", 
"2", "3", "4"))
2 голосов
/ 26 мая 2020

С помощью этого SO-ответа для моей второй строки мы можем использовать следующее dplyr решение:

library(dplyr)
df1 %>%
    ## First change all "nil" to NA, which allows us to use coalesce()
    mutate_all(na_if, "nil") %>%
    ## Then we use SO answer referenced above to get "Grade"
    mutate(Grade = apply(., 1, function(x) which(!is.na(x))[1])) %>%
    ## Next we can coalesce() the G columns together
    ## to get one Complications vector
    mutate(Complications = coalesce(G1, G2, G3)) %>%
    ## Finally we return just the desired columns
    select(Complications, Grade)

  Complications Grade
1         fever     3
2         other     3
3          <NA>    NA
4         trans     1
1 голос
/ 26 мая 2020

Вот простой базовый подход R.

data[data == "nil"] <- NA
Complications <- apply(data,1,max,na.rm = TRUE)
Complications
      1       2       3       4 
"fever" "other"      NA "trans" 

Grade <- sapply(seq_along(Complications),
                function(x){which(data[x,] == Complications[x])[1]})
Grade
[1]  3  3 NA  1
data <- structure(list(G1 = c("nil", "nil", "nil", "trans"), G2 = c("nil", 
    "nil", "nil", "nil"), G3 = c("fever", "other", "nil", "nil")), row.names = c("1", 
    "2", "3", "4"), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...