2015-12-21 62 views
2

我有它看起来像一个数据帧(DF),更换所有的细胞用0除少数指定值R

Id  Name  Activity. 
    1  ABC  a;sldkj kkkdk 
    2  two   llsjdfljs 
    3  three  case one 
    4  four  randshsjl lskjd 
    5  five  case seven 
    8  eight  sllslsll.asdhf 
    9  nine   case ten 

我想要的替换活动为“0”的所有值除“情况下,一个” , '案七' 的, '案例十'

Id  Name  Activity. 
    1  ABC  0 
    2  two  0 
    3  three  case one 
    4  four  0 
    5  five  case seven 
    8  eight  0 
    9  nine  case ten 

我试过,

df2 <- subset(df, df$`Activity.!='case one'|df$`Activity.`!='case two'|df$`Activity.`!='case three') 
    df2$Activity <- 0 
    df <- merge(df,df2) 

成为在代码冗长,所以我一直在寻找几类b埃特解决方案

+1

那你试试?为什么它不起作用? SO不是代码写入服务。 – Heroka

+0

@Maddy你为什么不接受解决方案?代码中的任何问题。 – akrun

+0

@akrun这是一个多按,错误的拨号,再次添加它) – Maddy

回答

3

我们可以使用grep

df1$"Activity."[!grepl('^case', df1$"Activity.")] <- 0 
df1 
# Id Name Activity. 
#1 1 ABC   0 
#2 2 two   0 
#3 3 three case one 
#4 4 four   0 
#5 5 five case seven 
#6 8 eight   0 
#7 9 nine case ten 

如果有更多case,我们只希望在上述 '情况'

df1$"Activity."[grepl('^case\\s+(one|seven|ten)', df1$"Activity.")] <- 0 

grep如果我们使用data.table ,更快和更有效的方法是set“活动”。当转换到“data.table”(setDT(df1,..)之后的“关键”柱,然后分配(:=),在“活动”到不在“情况下,一个”或“情况7”“0”的值,。 ..

library(data.table) 
setDT(df1, key='Activity.')[!(paste('case', c('one', 'seven', 
        'ten'))), Activity. := '0'] 
df1 
# Id Name Activity. 
#1: 1 ABC   0 
#2: 3 three case one 
#3: 5 five case seven 
#4: 9 nine case ten 
#5: 2 two   0 
#6: 4 four   0 
#7: 8 eight   0 
+0

感谢您的解决方案) – Maddy

2

尝试这种解决方案:

v <- paste("case", c("one", "seven", "ten")) 
df[!(df$Activity %in% v), ]