2011-12-27 6 views
4

У меня есть набор данных что-то вроде этого:Подменю dataframe в R с использованием двух критериев, один из них является регулярное выражение

col_a col_b col_c 
1  abc_boy 1 
2  abc_boy 2 
1  abc_girl 1 
2  abc_girl 2 

Мне нужно, чтобы выбрать первый ряд, основываясь только на col_b и col_c, а затем изменить valye в col_c, что-то вроде этого:

df[grep("_boy$",df[,"col_b"]) & df[,"col_c"]=="1","col_c"] <- "yes"

Но приведенный выше код не в порядке, так как первый критерий и второй критерии не исходят из тот же набор.

я могу сделать это в немом образом, используя явный цикл, или сделать «двухуровневой» Подменю, что-то вроде этого:

df.a <- df[grep("_boy$",df[,"col_b"]),]    #1 
df.b <- df[grep("_boy$",df[,"col_b"],invert=TRUE),] #2 
df.a <- df.a[df.a[,"col_c"]=="1","col_c"] <- "yes" #3 
df.a <- df.a[df.a[,"col_c"]=="2","col_c"] <- "no" #4 
df <- rbind(df.a,df.b)        #5 

Но я предпочитаю не делать, может кто-нибудь просветить меня, как для «объединения» #1 и #3? Благодарю.

+1

Дайте нам образец вывода, чтобы идти с образцом ввода, пожалуйста. Непонятно, что вы пытаетесь сделать. –

ответ

6

Попробуйте grepl вместо grep. grepl возвращает логический вектор (соответствует или нет для каждого элемента x), который может быть объединен с логическими операторами.

6

Причина, по которой она не работает, как вы ожидали, несмотря на правильную логику, заключается в том, что вы используете grep, где вы должны использовать grepl. Попробуйте вместо этого:

df[ grepl("_boy$", df[,"col_b"]) & df[,"col_c"]=="1", "col_c"] <- "yes" 

> df 
    col_a col_b col_c 
1  1 abc_boy yes 
2  2 abc_boy  2 
3  1 abc_girl  1 
4  2 abc_girl  2 

grepl Retruns логического вектора длина его аргументов, в то время как grep возвращает короткий числовой вектор, так что в этом случае получает переработан.

 Смежные вопросы

  • Нет связанных вопросов^_^