计算R中多列中的字符值

时间:2018-03-06 10:56:36

标签: r dataframe dplyr

我有一个这样的Dataframe:

teammember <- c('Member A', 'Member B', 'Member C')
value_a <- c('success', 'fail', NA)
value_b <- c('fail', NA, 'success')
value_c <- c('success', NA, 'fail')

data_df <- data.frame(teammember, value_a, value_b, value_c)

现在我想要计算每个人的成功&#39;由团队成员分组。我的想法是这样的:

data_df %>%
  group_by(teammember) %>% 
  filter(value_a == "success" | value_b == "success" | value_c == "success") %>% 
  summarise(sales = length(value_a) , length(value_b) , length(value_c)) %>% 
  select(teammember, sales)

我的结果如下:

# A tibble: 2 x 2
teammember sales
<fct>      <int>
1 Member A       1
2 Member C       1

但它应该是这样的:

# A tibble: 2 x 2
teammember sales
<fct>      <int>
1 Member A       2
2 Member C       1

您能告诉我正确的解决方案应该是什么样的吗? :)

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

一种选择是在开头使用filter_at,然后使用gather&#39;值_&#39;专栏进入&#39;长&#39;格式,filter&#39; val有&#34;成功&#34;字符串并获取count

library(dplyr)
library(tidyr)
data_df %>%
    filter_at(vars(matches("value")), any_vars(. %in% 'success')) %>% 
    gather(var, val, value_a:value_c, na.rm = TRUE) %>% 
    filter(val =='success') %>% 
    count(teammember)
# A tibble: 2 x 2
#  teammember     n
#   <fctr>     <int>
#1 Member A       2
#2 Member C       1

或者另一个选择是nest进行,然后使用map我们得到计数

library(purrr)
data_df %>% 
  nest(-teammember) %>%
  transmute(teammember, sales = map(data, ~ sum(unlist(.x) == "success", na.rm = TRUE))) %>% 
  filter(sales != 0)
#   teammember sales
#1   Member A     2
#2   Member C     1

答案 1 :(得分:0)

您使用success计算每列的summarize,而您想要的是每行successs的数量。您可以尝试rowSums

res <- data.frame(
    teammember = data_df$teammember,
    sales = rowSums(data_df[, paste0('value_', letters[1:3])] == 'success', na.rm = T)
)
#   teammember sales
# 1   Member A     2
# 2   Member B     0
# 3   Member C     1

可以使用res <- res[res$sales > 0, ]删除

值为零的行。