【问题标题】:R: fill new columns in data.frame based on row values by condition?R:根据条件的行值填充data.frame中的新列?
【发布时间】:2016-12-09 14:19:40
【问题描述】:

我想根据行中的值在我的 data.frame 中创建一个新列。

如果“类型”不等于“a”,我的“new.area”列应包含“a”类型的“区域”中的数据。这是针对多个“距离”。

Example:

# create data frame
distance<-rep(seq(1,5, by = 1),2)
area<-c(11:20)
type<-rep(c("a","b"),each = 5)

# check data.frame
(my.df<-data.frame(distance, area, type))

   distance area type
1         1   11    a
2         2   12    a
3         3   13    a
4         4   14    a
5         5   15    a
6         1   16    b
7         2   17    b
8         3   18    b
9         4   19    b
10        5   20    b

我想创建一个新列 (my.df$new.area),其中对于行中的每个“距离”,都会有“a”类型的“面积”值。

   distance area type new.area
1         1   11    a       11
2         2   12    a       12
3         3   13    a       13
4         4   14    a       14
5         5   15    a       15
6         1   16    b       11
7         2   17    b       12
8         3   18    b       13
9         4   19    b       14
10        5   20    b       15

我知道如何为单行手动制作:

my.df$new.area[my.df$distance == 1 ] <- 11

但是如何自动制作呢?

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用索引子集 ([) 和 match 的基本 R 解决方案:

    my.df$new.area <- with(my.df, area[type == "a"][match(distance, distance[type == "a"])])
    

    返回

    my.df
       distance area type new.area
    1         1   11    a       11
    2         2   12    a       12
    3         3   13    a       13
    4         4   14    a       14
    5         5   15    a       15
    6         1   16    b       11
    7         2   17    b       12
    8         3   18    b       13
    9         4   19    b       14
    10        5   20    b       15
    

    area[type == "a"] 提供可能性向量。 match 用于通过距离变量从该向量返回索引。 with用于避免my.df$的重复使用。

    【讨论】:

      【解决方案2】:

      我们可以使用data.table

      library(data.table)
      setDT(my.df)[, new.area := area[type=="a"] , distance]
      my.df
      #     distance area type new.area
      # 1:        1   11    a       11
      # 2:        2   12    a       12
      # 3:        3   13    a       13
      # 4:        4   14    a       14
      # 5:        5   15    a       15
      # 6:        1   16    b       11
      # 7:        2   17    b       12
      # 8:        3   18    b       13
      # 9:        4   19    b       14
      #10:        5   20    b       15
      

      或者我们可以使用距离的数字索引,因为它在序列中

      with(my.df, area[type=="a"][distance])
      #[1] 11 12 13 14 15 11 12 13 14 15
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-30
        • 2017-10-07
        • 1970-01-01
        相关资源
        最近更新 更多