假设这是我的爸爸。
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中,以下内容可以很容易地改写成单行本。
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
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)
在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
可以这样
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
这里的代码应该是有效的。
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_by
和 summarize
. 如果你想做更多的事情,而不是删除其 completion
变量为0,请您在问题中说明。