2017-02-17 55 views
0

以下是我正在嘗試執行的操作: 1.讀取csv文件 2.根據條件創建列號107並從列67中複製值:'only copy values if在70列的行值「是」」將if語句應用於數據框架元素

代碼:

report <- read.csv("C:\\Users\\ha317981\\Desktop\\practice\\input.csv", header=1) 
for(i in 1:length(report[[70]])-1){ 
    if(report[[i, 70]] =="Yes"){ 
     report[[i,107]] <-report[[i, 67]] 
    } 
    i<- i + 1 
    } 

Error: Error in [[.default (col, i, exact = exact) : attempt to select less than one element in get1index

回答

2

你可以用如下的向量化操作取代你的代碼。

report[,107] <- ifelse(report[,70] == "Yes", report[,67], NA) 
2

你也可以使用mutatedplyrifelse配對。

從文檔:

「變異增加了新的變數,並保留現有的;蛻變滴現有的變數。」

require(dplyr) 
report <- read.csv("C:\\Users\\ha317981\\Desktop\\practice\\input.csv", header=1) 

# mutate(tbl_df, NewColumn = Value, ...) 

newReport <- mutate(report, Col107 = ifelse(Col70 == "Yes", Col67, NA)) 

這將創建基於列70,其中該值將或者從柱67或NA被複制的值在(大概?)數據幀的新變量。

+0

謝謝! :)。你能否指出我的代碼有什麼問題? –

+0

問題是你的代碼試圖逐行創建一個新的列,而不是創建一個與其他列在一個語句中長度相同的列。 R中的數據幀需要使其所有列的長度相同(http://stackoverflow.com/questions/9253303/r-dataframe-with-varied-column-lengths)。爲了解決這個問題,你必須在'for'循環之前添加一列,然後_then_逐行更改它的值。你可以在'for'循環之前加入'report $ Col107 = NA'來做到這一點。 – JJEO

+0

瞭解。萬分感謝! –