【问题标题】:change column values in list of dataframes in R更改 R 中数据框列表中的列值
【发布时间】:2018-01-01 02:10:32
【问题描述】:

我有一个包含 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's 。所以我写了这个来定义一个数字向量,它将代表“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

到目前为止一切都很好,但是当我尝试对列表中的所有数据框执行相同的操作时,它失败了。我尝试编写以下命令,但效果不佳,我创建了一个函数,每个数据帧中的所有 7 列都将获取新值:

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

lapply(kvish_1_10t.tables, func)

如何更改每个数据框中的所有 day_mean 列?

【问题讨论】:

    标签: r list function dataframe


    【解决方案1】:

    只需在您的函数中添加return()

    func <- function(X) {
        X[,7][cc] <- NA   
    
        return(X)
    }
    
    new_df_list <- lapply(kvish_1_10t.tables, func)
    

    【讨论】:

    • 谢谢它的帮助,但是当我尝试在多个列中执行相同的操作时,它会显示一个错误:Error in [(*tmp*, cc, value = NA) : new columns would leave holes after existing columns跨度>
    • 原谅我,但您在帖子中只提到了一个专栏,而没有提到其他专栏,您也没有尝试过。请提供您在第 7 列中所做的示例。
    • 我对此提出了一个新问题。如果可以请看一下:stackoverflow.com/questions/45328937/…
    【解决方案2】:

    我希望有人会使用 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 2021-11-24
      • 2018-11-18
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多