2017-10-05 43 views
0

我有一個數據框有多個列。第一列沒有名稱,所以R給Col1標題給它。我必須從數據中刪除某些行在Col1中具有值「tbd」的幀。有條件地刪除行將所有值更改爲不適用

數據幀:

Col1 Name Addreess 
<NA> ABC ddfddf 
<NA> XYZ HJJJ 
<NA> KKL PPOI 
tbd HGGF UYTT 
<NA> fFFF OOOO 

我用下面的代碼來執行它,

df1<- df[!(df$Col1=="tbd"), ] 

和寫入在Excel格式的輸出。但是,輸出不會刪除tbd行並將數據幀中的所有值更改爲NA

+0

試試'subset(df1,is.na(Col1))'或'subset(df1,!Col1%in%'tbd')'''。如果只有NA元素和'tbd',那麼使用'is.na'來獲得那些具有NA的行,或者如果我們需要專門定位'tbd',那麼'%in%'或'!='ie'subset (df1,Col1!='tbd')' – akrun

+0

我試過使用這兩個..我得到錯誤-FUN中的錯誤(左):一元運算符的無效參數 – Joe

+0

請檢查'str(df1)'。它會給你想法。通常情況下,這應該工作,因爲我能夠得到基於示例顯示的輸出 – akrun

回答

1

我找到了使用循環的解決方案。這不是解決這個問題的最優雅的方式,但有幫助。

首先你的數據幀

Col1 <- c(NA,NA,NA,'tbd',NA) 
Name <- c('ABC','XYZ','KKL','HGGF','fFFF') 
Addreess <- c('ddfddf','HJJJ','PPOI','UYTT','OOOO') 
df <- data.frame(Col1,Name,Addreess) 
> df 
    Col1 Name Addreess 
1 <NA> ABC ddfddf 
2 <NA> XYZ  HJJJ 
3 <NA> KKL  PPOI 
4 tbd HGGF  UYTT 
5 <NA> fFFF  OOOO 

申請一個循環,以查找數據幀的COL1列有「TBD」的線,並建立一個新的,沒有「待定」,通過只選擇線在Col1中與 'NA'

df1 <- c() 
for(i in 1:nrow(df)){ 
    if(is.na(df$Col1[i])){ 
    df1 <- rbind(df1,df[i,]) 
    } 
} 

從而造成:

> df1 
    Col1 Name Addreess 
1 <NA> ABC ddfddf 
2 <NA> XYZ  HJJJ 
3 <NA> KKL  PPOI 
5 <NA> fFFF  OOOO 

編輯!

有執行這個更簡單和優雅的方式:

v <- which(df$Col1 %in% 'tbd') 
df <- df[-v,] 

我希望幫助你。

問候。

+0

這工作。我剛剛意識到除了NA,tbd之外,還有其他一些值,我不想放棄。所以,我只是螞蟻排除待定...有沒有辦法我可以修改該循環來檢查待定代替is.na函數的待定? – Joe

+0

在這種情況下,您可以使用循環選項。應用一個命令來查找'tbd'位置:v < - 哪一個(%'tbd'中的df $ Col1%),然後在沒有這些位置的情況下輸出:df [-v,]。這也是一個更優雅的方式來重製我的答案。 –