2016-04-22 50 views
0

我正在嘗試更改列表的多個特定列。我想使某些行(具體爲2,3,5,6)的所有值都具有相同的值。即列中的值對於每行是相同的。我想改變從NA的4列和第7到零的(0)lapply在特定列中的數據幀列表

我能夠以零列表中添加一列到每個數據幀與此:

lapply(df1, function(x) cbind(x,replace(x$efficiency, is.na(x$efficiency), "0"))) 

我一直在試圖使用此:

lapply(df1, na.locf,df1$Receiver) 

爲周圍的工作,但進展不大

樣本數據:

df1<-list(structure(list(dt15 = structure(c(1457929800, 1457930700, 
1457931600, 1457932500, 1457933400, 1457934300), class = c("POSIXct", 
"POSIXt"), tzone = ""), Receiver = c(480432, 480432, NA, NA, 
NA, NA), Code = c(62431, 62431, NA, NA, NA, NA), detections = c(6, 
1, NA, NA, NA, NA), distance = c(168.948559873358, 168.948559873358, 
NA, NA, NA, NA), Repeat_Rate = c(90L, 90L, NA, NA, NA, NA), efficiency =  c("60", 
"10", NA, NA, NA, NA)), .Names = c("dt15", "Receiver", "Code", 
"detections", "distance", "Repeat_Rate", "efficiency"), row.names = 635:640,  class = "data.frame"), 
structure(list(dt15 = structure(c(1457956800, 1457957700, 
1457958600, 1457959500, 1457960400, 1457961300, 1457962200, 
1457963100), class = c("POSIXct", "POSIXt"), tzone = ""), 
    Receiver = c(480422, 480422, NA, NA, NA, NA, 480422, 
    480422), Code = c(62427, 62427, NA, NA, NA, NA, 62427, 
    62427), detections = c(2, 2, NA, NA, NA, NA, 1, 3), distance = c(301.8128773339, 
    301.8128773339, NA, NA, NA, NA, 301.8128773339, 301.8128773339 
    ), Repeat_Rate = c(90L, 90L, NA, NA, NA, NA, 90L, 90L 
    ), efficiency = c("20", "20", NA, NA, NA, NA, "10", "30" 
    )), .Names = c("dt15", "Receiver", "Code", "detections", 
    "distance", "Repeat_Rate", "efficiency"), row.names = 665:672, class = "data.frame")) 

所需的輸出:

list(structure(list(dt15 = structure(c(1457929800, 1457930700, 
1457931600, 1457932500, 1457933400, 1457934300), class = c("POSIXct", 
"POSIXt"), tzone = ""), Receiver = c(480432, 480432, 480432, 
480432, 480432, 480432), Code = c(62431, 62431, 62431, 62431, 
62431, 62431), detections = c(6, 1, 0, 0, 0, 0), distance = c(168.948559873358, 
168.948559873358, 168.948559873358, 168.948559873358, 168.948559873358, 
168.948559873358), Repeat_Rate = c(90L, 90L, 90L, 90L, 90L, 90L 
), efficiency = c("60", "10", "0", "0", "0", "0")), .Names = c("dt15", 
"Receiver", "Code", "detections", "distance", "Repeat_Rate", 
"efficiency"), row.names = 635:640, class = "data.frame"), structure(list(
dt15 = structure(c(1457956800, 1457957700, 1457958600, 1457959500, 
1457960400, 1457961300, 1457962200, 1457963100), class = c("POSIXct", 
"POSIXt"), tzone = ""), Receiver = c(480422, 480422, 480422, 
480422, 480422, 480422, 480422, 480422), Code = c(62427, 
62427, 62427, 62427, 62427, 62427, 62427, 62427), detections = c(2, 
2, 0, 0, 0, 0, 1, 3), distance = c(301.8128773339, 301.8128773339, 
301.8128773339, 301.8128773339, 301.8128773339, 301.8128773339, 
301.8128773339, 301.8128773339), Repeat_Rate = c(90L, 90L, 
90L, 90L, 90L, 90L, 90L, 90L), efficiency = c("20", "20", 
"0", "0", "0", "0", "10", "30")), .Names = c("dt15", "Receiver", 
"Code", "detections", "distance", "Repeat_Rate", "efficiency" 
), row.names = 665:672, class = "data.frame")) 

回答

2

我不太清楚你想做的事,但是這應該幫助。創建修復單個數據幀

fix_data_frame = function(x) { 
    x[is.na(x[,7]),7] = 0 
    x[is.na(x[,4]),4] = 0 
    # What ever else you want to do 

    return(x) 
} 

要測試的函數:

fix_data_frame(df[[1]]) 
fix_data_frame(df[[2]]) 

一旦這樣的作品,只是堅持在lapply

lapply(df1, fix_data_frame)