假设我的数据框是这样的
col1 col2 col3 col4 col5 col6 col7
------------------------------------------------------
0 0 0 0 16,75 17,50 18,08
18 24 24 24 19,83 20,47 0,00
18 24 24 24 0,00 21,17 20,73
0 22 0 0 18,67 18,90 21,23
18 24 24 24 0,00 20,42 21,17
18 24 24 24 20,52 21,17 21,92
当列col5
,col6
和col7
包含0时,我想删除行。最后,数据框的形状应如下所示:
col1 col2 col3 col4 col5 col6 col7
-----------------------------------------------------
0 22 0 0 18,67 18,90 21,23
18 24 24 24 20,52 21,17 21,92
答案 0 :(得分:6)
我们可以使用filter_at
library(tidyverse)
df1 %>%
filter_at(vars(col5, col6, col7), all_vars(. != '0,00'))
答案 1 :(得分:5)
基本的R解决方案:
sapply查找不等于0的记录,围绕它的apply测试整个行是否仅包含TRUE值以及我们在data.frame中选择的值。
df1[apply(sapply(df1[, 5:7], function(x) x != 0), 1, all), ]
col1 col2 col3 col4 col5 col6 col7
1 0 0 0 0 16.75 17.50 18.08
4 0 22 0 0 18.67 18.90 21.23
6 18 24 24 24 20.52 21.17 21.92
数据(我使用dec =“,”读取您的数据,因此所有数据都被读取为数字):
df1 <- structure(list(col1 = c(0L, 18L, 18L, 0L, 18L, 18L), col2 = c(0L,
24L, 24L, 22L, 24L, 24L), col3 = c(0L, 24L, 24L, 0L, 24L, 24L
), col4 = c(0L, 24L, 24L, 0L, 24L, 24L), col5 = c(16.75, 19.83,
0, 18.67, 0, 20.52), col6 = c(17.5, 20.47, 21.17, 18.9, 20.42,
21.17), col7 = c(18.08, 0, 20.73, 21.23, 21.17, 21.92)), class = "data.frame", row.names = c(NA,
-6L))
答案 2 :(得分:4)
一种基本的R方法,该方法将数据中的相关列子集化,并检查它们是否为零。这不使用任何循环。
df[rowSums(df[c("col5", "col6", "col7")] == 0) == 0,]
# col1 col2 col3 col4 col5 col6 col7
# 1 0 0 0 0 16.75 17.50 18.08
# 4 0 22 0 0 18.67 18.90 21.23
# 6 18 24 24 24 20.52 21.17 21.92
我还使用dec=","
读取了数据(对我来说似乎很合逻辑)
df <- read.table(text="col1 col2 col3 col4 col5 col6 col7
0 0 0 0 16,75 17,50 18,08
18 24 24 24 19,83 20,47 0,00
18 24 24 24 0,00 21,17 20,73
0 22 0 0 18,67 18,90 21,23
18 24 24 24 0,00 20,42 21,17
18 24 24 24 20,52 21,17 21,92", header=TRUE, dec=",")