【问题标题】:Creating new columns based on certain strings appearing in a variable atleast twice根据变量中至少出现两次的特定字符串创建新列
【发布时间】:2020-06-01 15:24:12
【问题描述】:

我有一个包含变量“id”和“var1”的数据框,类似于以下内容:

set.seed(100)
id <- sample(1:3, 10, replace = TRUE)
set.seed(101)
var1 <- sample(LETTERS[1:3], 10, replace = TRUE)
df <- data.frame(id, var1)

如果某些字符串在 var1 中至少出现两次,我想按 'id' 对数据框进行分组并创建新列 'condition1'、'condition2'、'condition3' 等等。因此,当 'df' 按 'id' 分组时,如果 var1 == 'A' 并且出现在至少 2 行中,则 'condition1' 将为 1,否则 'condition1' 将设置为 0。类似地,'condition2' 将基于“B”,“condition3”将基于“C”。

所以,到目前为止,我已经尝试使用dplyr 并想出了以下内容-

library(dplyr)
df2 <- df %>% 
       group_by(id) %>% 
       summarise(condition1 = case_when(**var1 == "A" appears in at least 2 rows** ~ 1, **var1 == "A" appears only once or does not appear at all** ~ 0),
                 condition2 = case_when(**var1 == "B" appears in at least 2 rows** ~ 1, **var1 == "B" appears only once or does not appear at all** ~ 0),
                 condition3 = case_when(**var1 == "C" appears in at least 2 rows** ~ 1, **var1 == "C" appears only once or does not appear at all** ~ 0))

如何正确定义case_when 中的条件?也欢迎任何其他解决此问题的方法。

【问题讨论】:

  • 你能显示预期的吗?输出
  • 出现两次是什么意思? des 意思是连续的?
  • @akrun 预期结果是df2 &lt;- data.frame(id = 1:3, condition1 = c(0,1,0), condition2 = c(0,1,0), condition3 = c(0,0,1))
  • 如果是这种情况,只需在 RuiBarradas 代码中将 mutate 更改为 summarise
  • @Onyambu 字符串不必连续出现两次,它可以在分组的标题中至少出现两次。对于上面的数据,按id分组后,id=1时C只出现一次,A和B根本不出现,所以对于所有条件都是0。对于id=2,A和B至少出现两次,所以condition1和2应该是1,C应该是0。

标签: r dplyr


【解决方案1】:

这是一个简单的方法。使用逻辑值FALSE/TRUE 在内部编码为0/1sum 比较结果的事实。如果总和大于 1,则编码为 1,否则编码为 0

library(tidyverse)

df %>%
  group_by(id) %>%
  mutate(condition1 = as.integer(sum(var1 == "A") > 1),
         condition2 = as.integer(sum(var1 == "B") > 1),
         condition3 = as.integer(sum(var1 == "C") > 1))
## A tibble: 10 x 5
## Groups:   id [3]
#      id var1  condition1 condition2 condition3
#   <int> <fct>      <int>      <int>      <int>
# 1     2 A              1          1          0
# 2     3 A              0          0          1
# 3     2 B              1          1          0
# 4     3 C              0          0          1
# 5     1 C              0          0          0
# 6     2 A              1          1          0
# 7     2 B              1          1          0
# 8     3 C              0          0          1
# 9     2 A              1          1          0
#10     2 C              1          1          0

编辑。

根据 OP 的评论,要求的是 id 的摘要。

df %>%
  group_by(id) %>%
  summarise(condition1 = as.integer(sum(var1 == "A") > 1),
            condition2 = as.integer(sum(var1 == "B") > 1),
            condition3 = as.integer(sum(var1 == "C") > 1))
## A tibble: 3 x 4
#     id condition1 condition2 condition3
#  <int>      <int>      <int>      <int>
#1     1          0          0          0
#2     2          1          1          0
#3     3          0          0          1

【讨论】:

    【解决方案2】:

    使用 data.table

    df <- data.table(df)
    df[,.(condition1 = sum(var1 == "A") > 1,
          condition2 = sum(var1 == "B") > 1,
          condition2 = sum(var1 == "C") > 1), id]
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2011-10-02
      • 2015-09-24
      • 2016-11-28
      • 1970-01-01
      • 2020-08-16
      • 2021-11-29
      • 2021-01-02
      • 1970-01-01
      相关资源
      最近更新 更多