我想从data.frame中删除标准差为零的所有列.
这不起作用:
df <- df[, ! apply(df , 2 , function(x) sd(x)==0 ) ]
Run Code Online (Sandbox Code Playgroud)
我收到错误:
选择了未定义的列
UPDATE
我选择Filter了我的首选答案,因为它似乎也处理NAs,这是非常有用的.
例如,在
df <- data.frame(v1=c(0,0,NA,0,0), v2=1:5)
Run Code Online (Sandbox Code Playgroud)
Filter当apply方法产生错误时,删除列'v1' .
感谢所有其他解决方案,我从他们那里学到了很多东西.
UPDATE2:
应用给出的那些错误可以通过添加na.rm = TRUE到sd的调用来修复,如下所示:
df[, ! apply(df , 2 , function(x) sd(x, na.rm = TRUE)==0 ) ]
Run Code Online (Sandbox Code Playgroud)
除了@grrgrrbla和@akrun的答案之外Filter,这里有正确的方法来做你原来的想法:
df <- df[, !sapply(df, function(x) { sd(x) == 0} )]
Run Code Online (Sandbox Code Playgroud)
要么
df <- df[, sapply(df, function(x) { sd(x) != 0} )]
Run Code Online (Sandbox Code Playgroud)
我曾经sapply()得到一个向量,TRUE当数据帧列的标准偏差为0时,FALSE否则.然后我使用该向量对原始数据帧进行子集化.