【问题标题】:Create new variable in R data frame by conditional lookup通过条件查找在 R 数据框中创建新变量
【发布时间】:2015-10-03 18:16:07
【问题描述】:

我想在 R 数据框中创建一个新变量,方法是将现有列用作同一表中另一列的查找值。例如,在以下数据框中:

df = data.frame(
  pet = c("smalldog", "mediumdog", "largedog",
             "smallcat", "mediumcat", "largecat"),
  numPets = c(1, 2, 3, 4, 5, 6)
  )

> df

        pet numPets
1  smalldog       1
2 mediumdog       2
3  largedog       3
4  smallcat       4
5 mediumcat       5
6  largecat       6

我想创建一个名为 numEnemies 的新列,对于小动物来说它等于 0,但对于中型和大型动物来说,它等于大小相同但物种不同的动物的数量。我想结束这个:

        pet numPets numEnemies
1  smalldog       1          0
2 mediumdog       2          5
3  largedog       3          6
4  smallcat       4          0
5 mediumcat       5          2
6  largecat       6          3

我尝试这样做的方法是使用条件逻辑生成一个字符变量,然后我可以使用该变量从同一数据帧中查找我想要的最终值,这让我来到了这里:

calculateEnemies <- function(df) {
  ifelse(grepl('small', df$pet), 0,
         ifelse(grepl('dog', df$pet), gsub('dog', 'cat', df$pet),
                ifelse(grepl('cat', df$pet),
                       gsub('cat', 'dog', df$pet), NA)))
}

df$numEnemies <- calculateEnemies(df)

> df

        pet numPets numEnemies
1  smalldog       1          0
2 mediumdog       2  mediumcat
3  largedog       3   largecat
4  smallcat       4          0
5 mediumcat       5  mediumdog
6  largecat       6   largedog

我想修改这个函数,使用新生成的字符串根据 df$pet 中的对应值从 df$numPets 中查找值。我也愿意接受一种更好的方法,这种方法也可以泛化。

【问题讨论】:

    标签: r dataframe vector conditional


    【解决方案1】:

    以下是我使用 data.table 包的方法

    library(data.table)
    setDT(df)[, numEnemies := rev(numPets), by = sub(".*(large|medium).*", "\\1", pet)]
    df[grep("^small", pet), numEnemies := 0L]
    #          pet numPets numEnemies
    # 1:  smalldog       1          0
    # 2: mediumdog       2          5
    # 3:  largedog       3          6
    # 4:  smallcat       4          0
    # 5: mediumcat       5          2
    # 6:  largecat       6          3
    

    我基本上所做的是首先在整个数据集上创建 mediumlarge 组,然后反转每个组中的值。 然后,当grep("^small", pet) 时,我将0 分配给numPets 中的所有值。

    这应该既非常有效又强大,因为它适用于任意数量的动物,而且您实际上不需要先验地知道动物的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多