2015-09-29 3 views
1

У меня есть df с тремя тысячами строк, и я хотел бы создать новый столбец с нулями или в зависимости от слова, написанного в другом.с использованием логических операторов с символами

У меня есть функция, которая оценивает запись в столбце, и если она соответствует искомому слову, то в новом столбце возвращается «1». Как это:

oneorzero <- function(x) { 
    if (x["col_one"] == "dog") { 
    return("1") 
    } 
    return("0") 
} 
df["col_two"] = apply(df, 1, oneorzero) 

Я хотел бы быть в состоянии применить логический оператор ИЛИ так, что один будет добавлена ​​в различные другие слова встречаются, как это:

oneorzero <- function(x) { 
    if (x["col_one"] == "dog" | "cat" | "rat") { 
    return("1") 
    } 
    return("0") 
} 
df["col_two"] = apply(df, 1, oneorzero) 

Но, конечно, Безразлично 't, потому что логические операторы могут использоваться только для числовых значений. Кто-нибудь знает, как это можно сделать??

ответ

2

Вы не можете использовать логические операторы для символов, однако их можно использовать в логических операторах. Ваше if заявление должно выглядеть следующим образом:

oneorzero <- function(x) { 
    if (x["col_one"] == "dog" | x["col_one"] =="cat" | x["col_one"] =="rat") { 
return("1") 
    } 
    return("0") 
} 

Кроме того, есть vectorised версия if заявления под названием ifelse. Это может сделать ваш код более кратким и легким для чтения:

df["col_two"]=ifelse(df$col_one=="dog" | df$col_one=="cat" | df$col_one== "rat",1,0) 
2

Использование векторизации и %in% функции (см help("%in%"), но это должно быть само за себя):

as.integer(x["col_one"] %in% c("dog", "cat", "rat")) 

as.integer оказывается логичным значения в 0/1.

2

Всегда лучше использовать векторизованные решения в циклах R, затем. Для data.frame с 3K строками это не так важно, но для более крупных вы увидите большую разницу в производительности.

Для вашей проблемы я советую использовать функцию grepl.

# lets generate reproducible example 
set.seed(321) 
df <- data.frame(col_one = sapply(1:1e3, function(x) 
    paste(sample(c("dog", "cat", "fox", "rat", "bird", "car", "123"), 
       sample(1:7, 1), T), collapse = ","))) 

# how does it look like? 
head(df, 10) 
#       col_one 
# 1 123,cat,car,bird,rat,dog,fox 
# 2    car,rat,cat,123 
# 3       bird 
# 4      bird,fox 
# 5     bird,rat,123 
# 6 rat,123,car,bird,cat,dog,fox 
# 7      bird,123 
# 8 bird,fox,rat,dog,car,cat,123 
# 9      rat,car 
# 10  fox,dog,bird,car,rat,cat 

df$col_01 <- +(grepl("dog|cat|rat", df$col_one)) 
#       col_one col_01 
# 1 123,cat,cat,fox,fox,rat,fox  1 
# 2    car,bird,fox,car  0 
# 3       bird  0 
# 4      bird,fox  0 
# 5     bird,bird,123  0 
# 6 rat,bird,car,123,rat,dog,bird  1 
# 7      bird,bird  0 
# 8 bird,rat,car,dog,bird,rat,car  1 
# 9      rat,123  1 
# 10  fox,dog,123,cat,cat,rat  1 
Смежные вопросы