如何从数据框系统地删除列[R]

时间:2015-03-19 14:53:13

标签: r

我有一个数据集(df1),我希望将其归一化为另一个具有相同列名的数据集(df2)的平均值。 以下是df1的示例:

Rownames Region A Region B Region C
M1           4       5        6
M2           3       4        5
M3           2       5        6

但是,如果平均值低于df2中的某个数字,例如0.5,我想在df1中删除该列。我已经在 avgs 中找到了df2的平均值列表。

df2的平均值:

          Region A Region B Region C
Avgs          0.1       3        5

因此,如果df2的平均值为0.1,则应删除区域A.

Rownames Region B Region C
M1           5        6
M2           4        5
M3           5        6

这是我迄今为止为此目的所拥有的代码:

for(i in colNames.df1){
    if(avgs[[i]]<0.5){df1 <- subset(x = df1, select = -i)}

我认为这会有效,但我得到:&#34;对一元运算符的无效参数&#34; 关于

select = -i

我假设它是因为它是一个字符串,但我不知道如何解决这个问题。或许还有另一种方法,我没有想到这样做而没有子集?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以一步完成:

df1 <- df1[, -which(avgs < 0.5)]

这将从df1中删除avgs中的列(按索引),which()中的对应元素小于0.5。

正如@akrun在评论中指出的那样,如果avgs的元素的值低于0.5,则使用df1 <- df1[, !(avgs < 0.5)] 会失败。要解决这个问题,您也可以使用

avgs

df1中的值小于0.5时,这将使您与之前的方法相同。此方法会从条件!(avgs < 0.5)求值为FALSE的{​​{1}}中删除相应的列。但与之前的方法不同,如果所有案例都返回TRUE,则不会删除任何列。

你说错误是因为i是一个字符串。这种方法完全避免了这种情况。