簡體   English   中英

更改R中數據框列表中的列值

[英]change column values in list of dataframes in R

我有一個包含12個數據幀的列表。 列表的名稱是kvish_1_10t.tables 每個數據框都有一列“day_mean”(始終是所有數據幀中的7列)。 很難說所有的數據幀看起來都是一樣的。 這是其中一個表的示例:

  X2014_kvish_1_10t kvish keta maslul yom nefah date day_mean 1 1 10 1 1 1936 2014-09-07 00:00:00 2910.958 2 1 10 1 1 966 2014-09-07 01:00:00 2910.958 3 1 10 1 1 737 2014-09-07 02:00:00 2910.958 4 1 10 1 1 596 2014-09-07 03:00:00 2910.958 5 1 10 1 1 479 2014-09-07 04:00:00 2910.958 6 1 10 1 1 765 2014-09-07 05:00:00 2910.958 7 1 10 1 1 2082 2014-09-07 06:00:00 2910.958 8 1 10 1 1 3624 2014-09-07 07:00:00 2910.958 9 1 10 1 1 3847 2014-09-07 08:00:00 2910.958 10 1 10 1 1 2960 2014-09-07 09:00:00 2910.958 11 1 10 1 1 2871 2014-09-07 10:00:00 2910.958 12 1 10 1 1 3149 2014-09-07 11:00:00 2910.958 13 1 10 1 1 3615 2014-09-07 12:00:00 2910.958 14 1 10 1 1 3943 2014-09-07 13:00:00 2910.958 15 1 10 1 1 4079 2014-09-07 14:00:00 2910.958 16 1 10 1 1 4856 2014-09-07 15:00:00 2910.958 17 1 10 1 1 5010 2014-09-07 16:00:00 2910.958 18 1 10 1 1 4783 2014-09-07 17:00:00 2910.958 19 1 10 1 1 4684 2014-09-07 18:00:00 2910.958 20 1 10 1 1 4478 2014-09-07 19:00:00 2910.958 21 1 10 1 1 3610 2014-09-07 20:00:00 2910.958 22 1 10 1 1 2799 2014-09-07 21:00:00 2910.958 23 1 10 1 1 2346 2014-09-07 22:00:00 2910.958 24 1 10 1 1 1648 2014-09-07 23:00:00 2910.958 25 1 10 1 2 1145 2014-09-08 00:00:00 2745.917 26 1 10 1 2 671 2014-09-08 01:00:00 2745.917 ... 168 rows total 

現在,我改變了“day_mean”列(7在右列),以便在1,25,49,73,97,121,145 SEQ的位置的值(1,168,24)處仍將作為他們是,其余的將成為NA的。 所以我寫這個來定義一個數字向量,它將代表“day_mean”列中將獲得NA值的位置:

aa = seq(1, 168 , 24) 
bb = rep(T, 168)
bb[aa] = F
cc= (which(bb))


X2014_kvish_1_10t[,7][cc] = NA

現在,如您所見,我更改了我的“day_mean”列,因此只有相關值保持不變,其余的將變為NA。 像這兒:

 > X2014_kvish_1_10t kvish keta maslul yom nefah date day_mean 1 1 10 1 1 1936 2014-09-07 00:00:00 2910.958 2 1 10 1 1 966 2014-09-07 01:00:00 NA 3 1 10 1 1 737 2014-09-07 02:00:00 NA 4 1 10 1 1 596 2014-09-07 03:00:00 NA 5 1 10 1 1 479 2014-09-07 04:00:00 NA 6 1 10 1 1 765 2014-09-07 05:00:00 NA 7 1 10 1 1 2082 2014-09-07 06:00:00 NA 8 1 10 1 1 3624 2014-09-07 07:00:00 NA 9 1 10 1 1 3847 2014-09-07 08:00:00 NA 10 1 10 1 1 2960 2014-09-07 09:00:00 NA 11 1 10 1 1 2871 2014-09-07 10:00:00 NA 12 1 10 1 1 3149 2014-09-07 11:00:00 NA 13 1 10 1 1 3615 2014-09-07 12:00:00 NA 14 1 10 1 1 3943 2014-09-07 13:00:00 NA 15 1 10 1 1 4079 2014-09-07 14:00:00 NA 16 1 10 1 1 4856 2014-09-07 15:00:00 NA 17 1 10 1 1 5010 2014-09-07 16:00:00 NA 18 1 10 1 1 4783 2014-09-07 17:00:00 NA 19 1 10 1 1 4684 2014-09-07 18:00:00 NA 20 1 10 1 1 4478 2014-09-07 19:00:00 NA 21 1 10 1 1 3610 2014-09-07 20:00:00 NA 22 1 10 1 1 2799 2014-09-07 21:00:00 NA 23 1 10 1 1 2346 2014-09-07 22:00:00 NA 24 1 10 1 1 1648 2014-09-07 23:00:00 NA 25 1 10 1 2 1145 2014-09-08 00:00:00 2745.917 26 1 10 1 2 671 2014-09-08 01:00:00 NA 27 1 10 1 2 497 2014-09-08 02:00:00 NA ... 168 rows total 

到目前為止,everithing很順利,但是當我嘗試對列表中的所有數據幀執行相同的操作時,它就是falis。 我嘗試編寫以下命令,但它沒有成功,我創建了一個函數,每個數據幀中的所有7列都將獲得新值:

func = function(x) (x[,7][cc] = NA)

lapply(kvish_1_10t.tables, func)

如何更改每個數據框中的所有day_mean列?

只需在函數中添加一個return()

func <- function(X) {
    X[,7][cc] <- NA   

    return(X)
}

new_df_list <- lapply(kvish_1_10t.tables, func)

我希望有人會使用lapply發布一個答案,但看到沒有發布答案的答案,我在for循環方面做得更好,我想我至少會發布這個,希望它能解決你的直接問題:

d1<-data.frame(y1<-c(1,2,3),y2<-c(4,5,6))
d2 <- data.frame(y1=c(3,2,1),y2=c(6,5,4))
myl <- list(d1, d2)
cc <- c(1,3)
for (n in 1:length(myl)){
  myl[[n]][cc,2] <- NA
  print(myl[[n]][cc,2])
}

因此,對於您的具體示例,我認為這應該有效(假設kvish_1_10t.tables確實是一個列表 - 如果您不確定,請使用str(kvish_1_10t.tables)查看結構:

for (n in 1:length(kvish_1_10t.tables)){
 kvish_1_10t.tables[[n]][cc,"day_mean"] <- NA
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM