Новый столбец на основе значений строк - лучший способ? - PullRequest
0 голосов
/ 07 июня 2018

Конечно, есть лучший способ создать столбец, который соответствует столбцу 'target'?

Я искал Stack для ответа, но, похоже, никто не знал, как это сделать.Возможно, с совершенно глупой точки зрения (моя голова, возможно, была в режиме Stata, потому что так думает мой начальник, который попросил меня создать эту новую переменную 'output').

A       <-c("bears",  "bears",     "na",   "pandas",     "pandas",    "bears",   "pandas")
B       <-c("bears",  "pandas",     "na",   "bears",     "na",          "bears",   "pandas")
target  <-c("bears", "the_zoo",   "na",   "the_zoo",  "pandas",   "bears",   "pandas")
df_test <-data.frame(A,B,target,  stringsAsFactors =FALSE)

class(df_test$B)
for(i in 1:nrow(df_test)){
                          # Case: 1: Both are equal
    df_test$output[i] <- ifelse(df_test$A[i] == df_test$B[i],
                               yes = as.character(df_test$A[i]), 
                               # Case 2: A contains NA
                                no = ifelse(df_test$A[i] == "na",
                                            yes = as.character(df_test$B[i]),
                                            # Case 2.2: B contains NA
                                            no = ifelse(df_test$B[i] =="na",
                                                        yes = as.character(df_test$A[i]),
                                                        # Case 3: All other possibilities are "the_zoo"
                                                        no = "the_zoo"
                                                        )))
                                                    }
df_test



> df_test
       A      B  target  output
1  bears  bears   bears   bears
2  bears pandas the_zoo the_zoo
3     na     na      na      na
4 pandas  bears the_zoo the_zoo
5 pandas     na  pandas  pandas
6  bears  bears   bears   bears
7 pandas pandas  pandas  pandas

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Один из вариантов очистки кода - использовать case_when из пакета dplyr:

library(dplyr)

df_test$output <-
case_when(
    df_test$A == df_test$B ~ as.character(df_test$A),
    df_test$A == "na" ~ as.character(df_test$B),
    df_test$B =="na" ~ as.character(df_test$A),
    TRUE ~ "the_zoo"
)

Обратите внимание, что если столбцы A и B уже являются символьными, поскольку часть вашего кода, кажется, предполагает, что вы можете удалить ненужные вызовы на as.character выше.

0 голосов
/ 07 июня 2018

Что не так с

A       <-c("bears",  "bears",     "na",   "pandas",     "pandas",    "bears",   "pandas")
B       <-c("bears",  "pandas",     "na",   "bears",     "na",          "bears",   "pandas")
target  <-c("bears", "the_zoo",   "na",   "the_zoo",  "pandas",   "bears",   "pandas")
df_test <-data.frame(A,B,target,  stringsAsFactors =FALSE)

df_test$test <- with(df_test, ifelse(A == B, A, 
                       ifelse(A == "na",B, 
                              ifelse(B == "na", A, "the_zoo"))))


print(df_test)

, который производит:

       A      B  target    test
1  bears  bears   bears   bears
2  bears pandas the_zoo the_zoo
3     na     na      na      na
4 pandas  bears the_zoo the_zoo
5 pandas     na  pandas  pandas
6  bears  bears   bears   bears
7 pandas pandas  pandas  pandas

Вам не нужен цикл for, поскольку ifelse уже векторизован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...