【问题标题】:R data frame , New Vector with conditionR数据框,带条件的新向量
【发布时间】:2015-11-25 03:08:15
【问题描述】:

您好,我是 R 新手,我需要一些帮助

我有这样的数据

ID Age Sex
A01 30 m
A02 35 f
B03 45 m
C99 50 m
...

我想创建一个具有这样条件的新列组

if data1$age <30 then Group is = 1
else if data1$age >=30 and data1$age <40 then Group = 2
else if data1$age >=40 and data1$age <50 then Group = 3
else data1$age >=50 group = 4


 ID Age Sex Group
A01 30  m   2
A02 35  f   2
B03 45  m   3
C99 50  m   4

我如何在 R 中做到这一点

【问题讨论】:

    标签: r conditional-statements


    【解决方案1】:

    你可以试试findInterval,可以这样使用(使用@Tim的示例数据):

    > findInterval(data1$Age, c(0, 30, 40, 50))
    [1] 2 2 3 4
    

    【讨论】:

      【解决方案2】:

      一些不错的老式 Base R 将派上用场解决您的问题:

      data1 <- data.frame(ID=c("A01", "A02", "B03", "C99"),
                          Age=c(30, 35, 45, 50),
                          Sex=c("m", "f", "m", "m"))
      
      data1$Group[data1$Age < 30] <- 1
      data1$Group[data1$Age >= 30 & data1$Age < 40] <- 2
      data1$Group[data1$Age >= 40 & data1$Age < 50] <- 3
      data1$Group[data1$Age >= 50] <- 4
      
      > data1
         ID Age Sex Group
      1 A01  30   m     2
      2 A02  35   f     2
      3 B03  45   m     2
      4 C99  50   m     4
      

      顺便说一句,您在示例中将 ID A01 分类错误。由于他的年龄是 30 岁,按照你的逻辑,他属于第 2 组。

      【讨论】:

      • 是的,但是当我应用您的代码时出现问题,无法正常工作,第 3 组覆盖第 1 组和第 2 组...我不明白
      • 我刚刚使用扩展(随机)数据集测试了我的代码,它工作正常。请发布您的确切错误。
      • 例如 20 岁在第 3 组中
      • 不是根据我的测试。我认为你做错了什么。我还使用我的示例数据测试了@Ananda 给出的答案,并且它有效。
      • 这是一个常见的错误,我这样做的次数比我希望的要多:-)
      【解决方案3】:

      我们也可以使用cut

      cut(data1$Age, c(0,seq(30,50,10),Inf), right=FALSE, labels=FALSE)
      #[1] 2 2 3 4
      

      编辑:基于@thelatemail 的 cmets。

      【讨论】:

      • cut(data1$Age, c(0,seq(30,50,10),Inf), right=FALSE, labels=FALSE) 不应该覆盖它吗?
      猜你喜欢
      • 2012-06-09
      • 2020-07-13
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-28
      相关资源
      最近更新 更多