2015-12-21 52 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), ]