如何对列表中所有数据框的列进行复杂编辑?

时间:2018-02-25 07:01:47

标签: r list dataframe integer multiple-columns

我有一个名为WaFramesNumeric的185个数据框列表。每个数据帧都有数百列和数千行。我想编辑每个数据框,以便它保留所有数字列以及我指定的任何非数字列。

使用:

for(i in seq_along(WaFramesNumeric)) {
    WaFramesNumeric[[i]] <- WaFramesNumeric[[i]][,sapply(WaFramesNumeric[[i]],is.numeric)] 
}

成功地使每个数据框仅包含其数字列。

我尝试使用行修改此内容以添加特定列。我试过了:

for (i in seq_along(WaFramesNumeric)) {
    a <- WaFramesNumeric[[i]]$Device_Name
    WaFramesNumeric[[i]] <- WaFramesNumeric[[i]][,sapply(WaFramesNumeric[[i]],is.numeric)] 
    cbind(WaFramesNumeric[[i]],a)
}

并尝试调用所有整数列的列号以及特定列的列号,然后根据它进行组合:

for (i in seq_along(WaFramesNumeric)) {
    f <- which(sapply(WaFramesNumeric[[i]],is.numeric))
    m <- match("Cost_Center",colnames(WaFramesNumeric[[i]]))
    n <- match("Device_Name",colnames(WaFramesNumeric[[i]]))
    combine <- c(f,m,n)
    WaFramesNumeric[[i]][,i,combine]
}

这些都返回错误,我很难过如何做到这一点。 WaFramesNumeric是另一个数据框列表(WaFramesNumeric <- WaFramesAll)的副本,因此我也尝试添加WaFramesAll中的特定列,但这不成功。

我感谢您提出的任何建议,如果有任何不明之处我会道歉。

2 个答案:

答案 0 :(得分:5)

您错误地认为for循环中的最后一个命令是有意义的。它不是。实际上,它被丢弃了,所以既然你从未在任何地方分配它(cbindWaFramesNumeric...的索引),它就会被默默地丢弃。

此外,您在第三个代码块中对data.frame进行了过度索引。首先,它在data.frame中使用i,即使i是data.frames的list内的索引,而不是帧本身。第二个(可能由此引起),您试图索引2D帧的三维。只需将最后一个索引从[,i,combine]更改为[,combine][combine]

第三个问题(虽然可能还没有看到)是match如果找不到任何内容将返回NA。使用NA索引帧会返回错误(请尝试mtcars[,NA]查看)。我建议您可以将match替换为grep:当找不到任何内容时,它会返回integer(0),这就是您在这种情况下所需的内容。

for (i in seq_along(WaFramesNumeric)) {
  f <- which(sapply(WaFramesNumeric[[i]], is.numeric))
  m <- grep("Cost_Center", colnames(WaFramesNumeric[[i]]))
  n <- grep("Device_Name", colnames(WaFramesNumeric[[i]]))
  combine <- c(f,m,n)
  WaFramesNumeric[[i]] <- WaFramesNumeric[[i]][combine]
}

答案 1 :(得分:2)

我不确定你是什么意思&#34;尝试调用所有整数列的列号...&#34;,但是如果你想要查看数据帧列表并根据某些功能选择一些列,并保持给出一个列名,你可以这样做:

 @Override
 public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (getActivity()!=null)
    {

        refund.setChecked(false);


    }
}