【问题标题】:How to add text based on conditional statement in a new column如何在新列中添加基于条件语句的文本
【发布时间】:2019-04-11 07:40:18
【问题描述】:

在 RStudio 中,我想向数据框添加两个新列。这两列应根据数据框中已存在列的条件语句填充文本。

数据帧

变量为:数字c(1,2,3,4等)

我需要一个代码(语句),根据“数字”列中的数字创建和填写两个新列“type_a”和“type_b”。我必须使用确切的数字,所以“如果“数字”中的 1 用“some_text1”填写“type_a”,用“some_text2”填写“type_b”。下一行将是“如果“数字”中的 2 或 3 填写用“some_text3”输出“type_a”,用“some_text4”输出“type_b”。

这应该相当简单,但是,我是 R 新手,目前正在学习课程。

谢谢,

编辑:

感谢下面的答案,我现在已经设法用这段代码做我想做的事。现在的问题是,我能否以某种方式在第一个“case_when”中包含“type_b”语句,这样我就不必写两次数字列表,还是每个“case_when”只能包含一列? (在 SAS 中,我会先创建两列 type_a 和 type_b,然后写“if number in (1,2,4,6) then do; type_a='some_text'; type_b ='some_text2; end;)。

谢谢

ds <- tibble(number = 1:6)

ds %>% 
  mutate(
    type_a = case_when(
      number %in% c(1,2,4,6) ~ "some_text", TRUE ~ NA_character_
    ),
    type_b = case_when(
      number %in% c(1,2,4,6) ~ "some_text2", TRUE ~NA_character_
      )
    )

#The code below do not work, but hopefully you get the idea!

library(tidyverse)
ds <- tibble(number = 1:6)

 ds %>% 
  mutate(
    type_a, type_b = case_when(
      number %in% c(1,2,4,6) ~ "some_text", ~ "some_text2", 
TRUE ~ NA_character_))

【问题讨论】:

  • 欢迎来到 StackOverlflow。请查看如何在此处提供最小可重复示例,并确保添加您拥有的数据和您期望的数据。 stackoverflow.com/questions/5963269/…
  • 除上述内容外,请发布预期输出,当然还有您的尝试以及失败的地方
  • 您可以使用您的数字创建一个变量,并在您调用case_when 时使用它,即my_numbers &lt;- c(1, 2, 4, 6),然后将number %in% my_numbers 作为case_when 公式的左侧.
  • 问题是我在另一个数据集中有大约 200 个数字,每组 3-5 个。因此,每次我想添加一列时,我仍然必须编写相同的 30-40 个向量名称。

标签: r


【解决方案1】:

如果您刚开始使用 R,我建议您查看 Hadley Wickham 的“R 用于数据科学”(https://r4ds.had.co.nz/)。很好的资源。

这是我认为您正在尝试做的事情的解决方案:

library(tidyverse)
ds <- tibble(number = 1:5)

ds %>% 
mutate(
  type_a = case_when(
    number == 1 ~ "some_text1",
    number == 2 | number == 3 ~ "some_text3",
    TRUE ~ NA_character_
  ), 
  type_b = case_when(
    number == 1 ~ "some_text2",
    number == 2 | number == 3 ~ "some_text4",
    TRUE ~ NA_character_
  )
)

【讨论】:

  • 谢谢,这很好用。但是,如果您有,有没有办法简化代码? 5个数字应该有相同的对应文本?与其写成 "number == 1| number == 2 | number == 3 number == 4| number == 5 | ~ "some_text1"",不如用 "number == 1,2,3,4" 来简化,5 ~ “some_text1””? (抱歉没有正确发布代码,仍在研究如何使用stackoverflow,我会在完成后尝试发布我的代码)
  • 查看%in% 运算符(即match 函数)。我想这就是你要找的东西:number %in% 1:5
【解决方案2】:

你可以用你的键创建一个数据框来替换和使用merge函数:

n <- 4
df <- data.frame(number = sample(1:n, 10, replace = TRUE))
df
>   number
1       2
2       2
3       1
4       4
5       4
6       1
7       4
8       3
9       1
10      3


df_text <- data.frame(number = 1:n, text_a = paste0("text", 1:n), text_b = paste0("text", 1:n+n))
df_text
>  number text_a text_b
1      1  text1  text5
2      2  text2  text6
3      3  text3  text7
4      4  text4  text8

merge(df, df_text)
>   number text_a text_b
1       1  text1  text5
2       1  text1  text5
3       1  text1  text5
4       2  text2  text6
5       2  text2  text6
6       3  text3  text7
7       3  text3  text7
8       4  text4  text8
9       4  text4  text8
10      4  text4  text8

如果订单很重要,您可以在merge 中使用sort = FALSE

【讨论】:

    猜你喜欢
    • 2017-10-07
    • 2013-05-10
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2019-12-15
    相关资源
    最近更新 更多