2014-02-18 92 views
0

我想看看哪些值有特定的入口問題,但我沒有把事情做好。 例如,我需要從列「c」的屏幕值打印,但條件是從「b」給定值說[b == 0]。 最後,我需要爲那些條件爲真的人添​​加一個新字符串。有條件地在R中顯示值

df<- structure(list(a = c(11.77, 10.9, 10.32, 10.96, 9.906, 10.7, 
11.43, 11.41, 10.48512, 11.19), b = c(2, 3, 2, 0, 0, 0, 1, 2, 
4, 0), c = c("q", "c", "v", "f", "", "e", "e", "v", "a", "c")), .Names = c("a", 
"b", "c"), row.names = c(NA, -10L), class = "data.frame") 

我想這沒有成功:

if(df[b]==0){ 
print(df$c) 
} 


if((df[b]==0)&(df[c]=="v")){ 
df[c] <-paste("2") 
} 

感謝您的幫助。

回答

1

這有幫助嗎?

rows <- which(df$b==0) 
if (length(rows)>0) { 
    print(df$c[rows]) 
    df$c[rows] <- paste(df$c[rows],'2') 
    ## maybe you wanted to have: 
    # df$c[rows] <- '2' 
} 
3

正確的語法是像df[rows, columns],所以你可以嘗試:

df[df$b==0, "c"] 

可以完成更改值使用ifelse

df$c <- ifelse(df$b==0 & df$c=="v", paste(df$c, 2, sep=""), df$c) 
+0

除了如預期,如果有* NA *值,它不會工作:* NA == 0的真值是* * NA *,所以** ifelse **構造不適合這種情況。或者我錯了某處? – Jealie

+0

我想這取決於NA值應該如何處理特定問題。 – celiomsj

+0

你是對的:)我只是想分享一個我必須合作的代碼,由別人編寫的代碼,其中包含了這個精確的錯誤。我相信,在子集化時使用** which **,或者明確寫入條件(df $ b == 0&!is.na(df $ b))通常是一種很好的做法。 – Jealie

1

有幾種方法進行子集的R數據,例如:

df$c[df$b == 0] 
df[df$b == 0, "c"] 
subset(df, b == 0, c) 
with(df, c[b == 0]) 
# ... 

有條件地添加另一列(在這裏:TRUE/FALSE):

df$e <- FALSE; df$e[df$b == 0] <- TRUE 
df <- transform(df, c = ifelse(b == 0, TRUE, FALSE)) 
df <- within(df, e <- ifelse(b == 0, TRUE, FALSE)) 
# ... 
+0

...以及所有這些子集數據的方式都有一個共同點:如果您碰巧在** df $ b **中有* NA *值,它們會使您發瘋。舉個例子,如果** df $ b **是** c(0,1,NA)**和** df $ c **是** c(5,6,7)**,那麼** df $ c [df $ b == 0] **將產生** c(5,NA)**。 根據我的經驗,使用** which **函數進行子集是一個很好的習慣:例如** df $ c [which(df $ b == 0)] ** – Jealie

+0

@Jealie Well'NA's有一個原因,就像R處理默認的方式一樣。我會說這兩種方式,邏輯索引和按行索引('which'),都有權存在。 – lukeA