如何从数据帧中删除某些条件

问题描述 投票:0回答:2

假设这是我的爸爸。

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)

我想删除所有没有完成任何活动的人。

我试过这段代码,但不知为何没有用。我不知道这里会有什么问题。

nevercompleted<- df %>% 
  filter(completion != 0) %>% 
  group_by(people) %>% 
  summarise("frequency activity" = n())

df<- -c (df$nevercompleted)

所以,在这种情况下,人4应该从df中删除。请注意,我只想删除那些从未完成过活动的人。任何 像人4,而不是人1谁在一个点上完成一个活动。

r variables data-cleaning
2个回答
2
投票

1. 基数R

在基础R中,以下内容可以很容易地改写成单行本。

i <- ave(as.logical(df$completion), df$people, FUN = function(x) any(x != 0, na.rm = TRUE))
df <- df[which(i), ]
df
#   people activity completion
#1       1        1          0
#2       1        1          0
#3       1        1          1
#4       2        2          0
#5       2        2          1
#6       3        3          1
#7       3        4          1
#10      5        6          0
#11      5        6          1

2. 包 dplyr

而这里是一个 dplyr 的方式。

首先只过滤已经完成活动的人,然后与原始数据集连接,以获得所有列。

df <- df %>%
  group_by(people) %>%
  summarise(completion = any(as.logical(completion))) %>%
  filter(completion) %>%
  select(-completion) %>%
  left_join(df, by = 'people')

df
#`summarise()` ungrouping output (override with `.groups` argument)
## A tibble: 9 x 3
#  people activity completion
#   <dbl>    <dbl>      <dbl>
#1      1        1          0
#2      1        1          0
#3      1        1          1
#4      2        2          0
#5      2        2          1
#6      3        3          1
#7      3        4          1
#8      5        6          0
#9      5        6          1

数据集

在本题中,没有 data.frame 指令,只是创建列向量。

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)
df <- data.frame(people, activity, completion)

2
投票

在Base中,我们可以这样做

    byGroup <- split(df,df$people)
    do.call(rbind,byGroup[sapply(byGroup, function(x) !all(x$completion == 0))])

      people activity completion
1.1       1        1          0
1.2       1        1          0
1.3       1        1          1
2.4       2        2          0
2.5       2        2          1
3.6       3        3          1
3.7       3        4          1
5.10      5        6          0
5.11      5        6          1

0
投票

可以这样

library(tidyverse)
df <- tibble(people, activity, completion)

df %>% 
  group_by(people) %>% 
  filter(any(completion != 0))

# A tibble: 9 x 3
# Groups:   people [4]
  people activity completion
   <dbl>    <dbl>      <dbl>
1      1        1          0
2      1        1          0
3      1        1          1
4      2        2          0
5      2        2          1
6      3        3          1
7      3        4          1
8      5        6          0
9      5        6          1

-1
投票

这里的代码应该是有效的。

library(dplyr)

people <- c(1,1,1,2,2,3,3,4,4,5,5)
activity <- c(1,1,1,2,2,3,4,5,5,6,6)
completion <- c(0,0,1,0,1,1,1,0,0,0,1)

df <- data.frame(people, activity, completion)

df <- filter(df, completion != 0)

Result:

  people activity completion
1      1        1          1
2      2        2          1
3      3        3          1
4      3        4          1
5      5        6          1

这将会过滤你的数据框中的行,这些行的属性是 completion 变量不是0。

我不知道你要去哪里与 group_bysummarize. 如果你想做更多的事情,而不是删除其 completion 变量为0,请您在问题中说明。

© www.soinside.com 2019 - 2024. All rights reserved.