【问题标题】:R - lapply() Returning Null Values in Data FrameR - lapply() 在数据框中返回空值
【发布时间】:2015-11-30 03:27:01
【问题描述】:

我有一个数据框,util_final 有一列,utilization_Ratio我想用它来分配分类值。

数据框的结构如下:

$ Patient_ID       : Factor w/ 3242 levels "0000001C-89D2-40FF-868D-8E1B4C8C9114",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ OP               : num  1 11 2 1 5 6 12 8 10 6 ...
 $ IP               : num  2 0 0 1 1 3 4 5 0 3 ...
 $ Total            : num  3 11 2 2 6 9 16 13 10 9 ...
 $ utilization_Ratio: num  0.667 0 0 0.5 0.167 ...

我创建了这个函数来定义上述分类值:

assign_risk_factor=function(x) {
  for(i in util_final$utilization_Ratio) {
    if(i<0.33) {
      print("Low")
    } else if(i>0.67) {
      print("High")
    } else {
      print("Medium")
    }
  } 
}

然后我尝试使用 lapply() 将函数与数据框连接,将函数中定义的分类变量插入数据框的新列中:

util_final$Risk_Factor=lapply(util_final$utilization_Ratio,assign_risk_factor)

这确实创建了新列,但它只是在列的每一行中插入一个“NULL”,如下所示:

Patient_ID OP IP Total utilization_Ratio Risk_Factor
0000001C-89D2-40FF-868D-8E1B4C8C9114 0000001C-89D2-40FF-868D-8E1B4C8C9114  1  2     3         0.6666667        NULL
001B8544-508E-4CBE-A40A-EAAD97E541BE 001B8544-508E-4CBE-A40A-EAAD97E541BE 11  0    11         0.0000000        NULL
00336A6F-93D8-42F6-B2E5-A1EF12C2BD75 00336A6F-93D8-42F6-B2E5-A1EF12C2BD75  2  0     2         0.0000000        NULL
0039B0C1-E84F-4B90-AD9B-985C9F39ABD1 0039B0C1-E84F-4B90-AD9B-985C9F39ABD1  1  1     2         0.5000000        NULL
003E8473-C645-4AF2-B48A-86BE76188CC5 003E8473-C645-4AF2-B48A-86BE76188CC5  5  1     6         0.1666667        NULL
00765CEF-B05C-471F-B91F-8154E6158486 00765CEF-B05C-471F-B91F-8154E6158486  6  3     9         0.3333333        NULL

真正让我感到困惑的部分:当我运行 lapply() 函数时,控制台似乎显示了按预期产生的分类变量(换句话说,表明我创建的 For 循环有效)。然而,我的数据框生成的新列仅包含 NULL。

谢谢!

【问题讨论】:

  • 不要使用print(这是为了显示目的)。而是将"Low""High""Medium" 分配给一个变量,然后在函数assign_risk_factor 的末尾分配return() 这个变量。
  • 您实际上正在运行两个循环:一个为每个 util_final$utilization_Ratio 值使用 lapply,另一个 for 循环在您每次调用 assign_risk_factor 时重复该过程。我无法说出努力的目标是什么。当努力的目标没有用自然语言清楚地描述时,说你遇到困难通常是不明智的。
  • 谢谢你们!在 R 中,循环对我来说仍然是一个相对较新的概念,因此您可以看到我有很多东西要学习。

标签: r


【解决方案1】:

你的函数实际上并没有返回任何东西。打印与返回不同,并且您没有在 for 循环中构建任何类型的向量。另外,cut() 函数可以为您进行这种类型的拆分。怎么样

util_final$Risk_Factor <- cut(util_final$utilization_Ratio, 
    breaks = c(-Inf, .33, .67, Inf), 
    labels = c("Low","Medium","High"))

【讨论】:

  • 其实print方法一般有两种后果:一种是输出到控制台,一种是返回值。
  • 效果很好,非常感谢!当我学习如何构建循环时,示例包含 print(),所以我从那个参考点着手。
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多