这可能很简单,但我在这个网站上看了很多答案都没有找到解决方案。我有一个数据框,我想删除所有等于1的观测值。在我的原始数据框中,有超过90列。
我已经尝试过使用lapply函数和过滤,但我不能让它工作。
df <- data.frame(x1 = c('0','1', '0', '1', '1'),
x2 = c('1','0', '1', '1', '0'),
x3 = c('1','0', '1', '1', '1'))
df[] <- lapply(df, function(x) subset(df, x==0 ))
df<- as.data.frame(lapply(df, function(x) subset(df, x==0 )))
df[] <- lapply(df, function(x) df[!(df$x ==1),])
library(dplyr)
df %>% filter(!all(df == 1))
df<-df[!(df ==1),]
我的预期输出是
x2 x3
0 0
如果你使用 data.table
:
DT<-as.data.table(df)
ans<-DT[,lapply(.SD, function(x){subset(x,x!="1")})]
ans
您可以使用 rowSums
来选择除1以外存在单一值的行。
df[rowSums(df != 1, na.rm = TRUE) > 0, ]
#Another way
#df[rowSums(df == 1, na.rm = TRUE) != ncol(df), ]
# x1 x2 x3
#1 0 1 1
#2 1 0 0
#3 0 1 1
#4 1 0 1
或者使用 dplyr
:
library(dplyr)
df %>% filter_all(any_vars(. != 1))
你可以保留这些行 var
iance不是零。当我们使用 %in%
,缺失值的行将被保留。
df
# x1 x2 x3
# 1 0 1 1
# 2 1 0 0
# 3 <NA> 1 1
# 4 1 1 1
# 5 1 0 1
df[!apply(df, 1, var) %in% 0, ]
# x1 x2 x3
# 1 0 1 1
# 2 1 0 0
# 3 <NA> 1 1
# 5 1 0 1
数据。
我在第3行加了一个缺失的值。
df <- structure(list(x1 = c("0", "1", NA, "1", "1"), x2 = c("1", "0",
"1", "1", "0"), x3 = c("1", "0", "1", "1", "1")), class = "data.frame", row.names = c(NA,
-5L))
这是否回答了你的问题?
df[df == 1] <- 0
输出:数据:我在第3行添加了一个缺失的记录,这是否回答了你的问题?
x1 x2 x3
50 0 0
0 50 50
10 0 0
0 0 NA
0 100 0
数据:
df <- data.frame('x1' = c('50','1', '10', '1', '1'), "x2" =
c('1','50', '1', '1', '100'), "x3" = c('1','50', '1', NA, '1'))