【问题标题】:R - creating new columns with criteria based on other columns?R - 使用基于其他列的标准创建新列?
【发布时间】:2019-05-08 20:07:37
【问题描述】:

我有以下结构:

df <- head(mtcars[,c("cyl","disp","hp")])
criteria <- data.frame("cyl" = c(3,8), "disp" = c(180,380), "hp" = c(90,120),row.names = c("min","max"))

df
                  cyl disp  hp
Mazda RX4           6  160 110
Mazda RX4 Wag       6  160 110
Datsun 710          4  108  93
Hornet 4 Drive      6  258 110
Hornet Sportabout   8  360 175
Valiant             6  225 105
> criteria
    cyl disp  hp
min   3  180  90
max   8  380 120

现在我想创建一个新列,它首先根据标准数据框检查标准,然后计算一个比率。例如,我想创建一个名为“disp/cyl”的列,它应该首先根据条件列检查 disp 和 cycl 列是否在最小值和最大值范围内。如果是这种情况,那么计算应该是比率 disp/cyl。如果不是这种情况,它应该只返回 0。同样,我想对名为“hp/disp”的列执行相同操作,它应该检查 disp 和 hp 是否满足最小值和最大值,然后计算 hp/disp 的比率否则它应该只返回 0。

这是否可能以某种方式一次性完成?我将如何建立标准?

【问题讨论】:

  • 你想要这个仅用于 hp/disp 还是包含 'cyl'
  • 我只想将新列添加到原始数据框中。应包括原始列。

标签: r


【解决方案1】:

我们可能需要根据条件创建一个逻辑向量

i1 <- Reduce(`&`, Map(function(x, y) (x > y[1] & x < y[2]) & 
   (df$cyl > criteria$cyl[1] & df$cyl < criteria$cyl[2]), df[2:3], criteria[2:3]))
df$disp_cyl[i1] <- df$disp[i1]/df$cyl[i1]
df$hp_cyl[i1] <- df$hp[i1]/df$cyl[i1]
df <- replace(df, is.na(df), 0)

如果两列的条件应该分开,那么做

df[c('disp_cyl', 'hp_cyl')] <-  Map(function(x, y) 
     x/df$cyl *((x > y[1] & x < y[2]) & 
      (df$cyl > criteria$cyl[1] & df$cyl < criteria$cyl[2])),
            df[2:3], criteria[2:3])

【讨论】:

  • 第二段代码似乎没有运行,但第一段看起来正在做我期望的事情。你能解释一下这里的逻辑吗? Reduce 和 Map 在做什么?
  • @user33484 抱歉丢失了) df[c('disp_cyl', 'hp_cyl')] 已修复
  • @user33484 在第一种情况下,我们循环遍历'df'和'criteria'('disp','hp')的对应列,通过比较两个数据集的对应列来创建条件在Map 中,然后将Reduce 逻辑vectorslist&amp; 合并为一个。该向量用于对列进行子集化并进行除法。在第二种情况下,我们在每一列('hp/disp`)上分别执行逻辑步骤并进行除法。
  • 谢谢,很抱歉仍然无法理解。循环是如何通过 Map 和 Reduce 发生的?从来没有遇到过这些功能。我了解其余步骤
  • @user33484 要理解这一点,请检查Map(function(x, y) x, df[2:3], criteria[2:3])Map(function(x, y) y, df[2:3], criteria[2:3]) 的输出。在这里,'x' 将是 'df' 2 和 3 的列作为列表元素,y 作为标准的列。换句话说,我们比较两个数据集的相似列
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2021-12-30
  • 1970-01-01
相关资源
最近更新 更多