【问题标题】:Assigning factor levels to observations using more than one numeric vector使用多个数值向量将因子水平分配给观察值
【发布时间】:2015-04-20 03:10:58
【问题描述】:

我提前为笨拙的标题道歉,但我不知道如何更准确地定义我想要做的事情。

首先,我将生成一小部分数据:

data<-data.frame("ID"=c("A","A","A","B","B","B","C","C","C"),
                 "emp.num"=c(2,3,100,150,250,300,400,500,600),
                 "rev"=c(10,80,100,200,300,50,300,350,350))

看起来像这样:

  ID emp.num rev
1  A       2  10
2  A       3  80
3  A     100 100
4  B     150 200
5  B     250 300
6  B     300  50
7  C     400 300
8  C     500 350
9  C     600 350

其中“ID”是公司名称,“emp.num”代表公司员工人数,“rev”代表收入。

我想做的是创建一个因子变量(Size),根据以下原则将公司分为“小”、“中”和“大”:

小型:rev(0,65] 和 emp.num (0,50] 的公司

medium:rev(65,260] 和 emp.num (50,250] 的公司

大:rev>260 和 emp.num>250

所以最后我想得到这个:

  ID emp.num rev Size
1  A       2  10    S
2  A       3  80    M
3  A     100 100    M
4  B     150 200    M
5  B     250 300    L
6  B     300  50    L
7  C     400 300    L
8  C     500 350    L
9  C     600 350    L

如果我想仅从单个数字(假设仅从 rev 或仅从 emp.num)创建因子变量,使用 cut() 函数当然会是一个简单的问题,但我已经完成了当我想使用这样的 2 个变量时,如何“削减”的损失

【问题讨论】:

  • 欢迎来到 SO:SE。你有问题吗?如果您需要指导,请参阅 How to Ask

标签: r


【解决方案1】:

使用findInterval 会怎样?

ind <- pmax(findInterval(data$emp.num, c(0, 50, 250, Inf)),
       findInterval(data$rev, c(0, 65, 260, Inf)))

cbind(data, size = c("Small", "Medium", "Large")[ind])
  ID emp.num rev   size
1  A       2  10  Small
2  A       3  80 Medium
3  A     100 100 Medium
4  B     150 200 Medium
5  B     250 300  Large
6  B     300  50  Large
7  C     400 300  Large
8  C     500 350  Large
9  C     600 350  Large

【讨论】:

  • 谢谢!很高兴听到专家的意见! :)
  • 哇,竟然不知道有这个函数,很简洁优雅,谢谢!
  • 转念一想,我遇到了您的解决方案的问题。如果我理解正确,“pmax”函数将检查 emp.num 或 rev 是否​​是较大的数字,并将检查较大数字落在哪个区间并相应地对其进行分类(小、中、大)。 pmax 方法的问题是,例如,如果公司的 emp.num=51 和 rev=64。由于 rev 是较大的数字,因此您的算法仅检查 rev,如果 rev=64,则根据指定的时间间隔,公司很小。但实际上它是中等的,因为 emp.num=51
  • 因此,例如,如果 emp.num=2 和 rev=1000,并且我使用 pmin 不会将公司分类为自 emp.num260 以来的大公司?我觉得某处需要某种“和”条件......
  • 问题是,您没有在问题中阐明一个变量属于一个区间而另一个变量属于另一个区间的情况。如果较高的值更重要,请使用pmax,如果较低的值更重要,请使用pmin
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2017-01-26
  • 1970-01-01
  • 2016-07-19
  • 2021-04-17
  • 1970-01-01
  • 2017-07-18
相关资源
最近更新 更多