这可能非常简单,但是我没有找到解决方案,而是在整个站点上查看了答案。我有一个数据框,我想删除所有等于1的观察值。在我的原始df中,有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),]
或使用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
输出:
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'))