1

我是 R 新手,我正在尝试根据列中的数据引入一个组列。

data.frame 示例

1           11.3178501            4    9        11.618880
2           10.3969713           20    8        11.047486
8            9.5067421           14    7        10.079806
6            6.6135932            6    6         7.002669
4            5.4157174            2    5         5.566232
17           3.8860793            5    4         4.235564
16           3.8183699           15    3         4.406416
11           1.2574765           18    2         1.885113
15           0.7084411            7    1         1.130990

第一列是 R 引入的索引,但我排序所以顺序不同,我想做的是引入一个列,该列根据最后一列值定义每行所属的括号。所以如果最后一列的值介于0-5 => 1, 5-0 => 2等之间,那么我们在最后添加一个新列group -> 1,2,3...

16           3.8183699           15    3         4.406416    1
11           1.2574765           18    2         1.885113    2
15           0.7084411            7    1         1.130990    2

我尝试了以下dataFrame$column4 < 5,但这给了我一个布尔值,所以我想我将它乘以 1 然后我得到以下

0 0 0 0 0 1 1 1 1

我不确定我是否走在正确的轨道上。

4

2 回答 2

5

即使给出您的评论,我仍然建议cut。它在基础 R 中,通常不被认为是一个花哨的函数。

df <- structure(list(V1 = c(1L, 2L, 8L, 6L, 4L, 17L, 16L, 11L, 15L), 
    V2 = c(11.3178501, 10.3969713, 9.5067421, 6.6135932, 5.4157174, 
    3.8860793, 3.8183699, 1.2574765, 0.7084411), V3 = c(4L, 20L, 
    14L, 6L, 2L, 5L, 15L, 18L, 7L), V4 = c(9L, 8L, 7L, 6L, 5L, 
    4L, 3L, 2L, 1L), V5 = c(11.61888, 11.047486, 10.079806, 7.002669, 
    5.566232, 4.235564, 4.406416, 1.885113, 1.13099)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-9L))

df$groups <- cut(df$V5, seq(0,15, by=5))

> df
  V1         V2 V3 V4        V5  groups
1  1 11.3178501  4  9 11.618880 (10,15]
2  2 10.3969713 20  8 11.047486 (10,15]
3  8  9.5067421 14  7 10.079806 (10,15]
4  6  6.6135932  6  6  7.002669  (5,10]
5  4  5.4157174  2  5  5.566232  (5,10]
6 17  3.8860793  5  4  4.235564   (0,5]
7 16  3.8183699 15  3  4.406416   (0,5]
8 11  1.2574765 18  2  1.885113   (0,5]
9 15  0.7084411  7  1  1.130990   (0,5]
> 

最后,如果整数是您想要的,您可以groups使用factor.

df$groups <- as.integer(df$groups)

> as.integer(df$groups)
[1] 3 3 3 2 2 1 1 1 1
于 2012-06-20T18:51:59.120 回答
1

贾斯汀的回答很好;但是,如果您想自己实现较笨的切割,则可以这样做。首先,您使用阈值定义一个向量,例如thre<-c(0,5,10,15),然后使用大于运算符对您的值和那些阈值进行外部比较,并对这样创建的矩阵的行求和:

rowSums(outer(values,thre,'>'))

瞧,(0,5] 中的所有值现在都是 1,(5,10] 是 2,等等。
包装在一个函数中,它可能看起来像这样:

ultraDumbCut<-function(v,thre) rowSums(outer(v,thre,'>'))

变得更加智能,如下所示:

dumbCut<-function(v,jump=5,thre=seq(0,max(v),by=jump)) rowSums(outer(v,thre,'>'))

所以dumbCut(1:7)就是1 1 1 1 1 2 2dumbCut(1:7,3)1 1 1 2 2 2 3dumbCut(1:7,thre=c(0,2,3,5))1 1 2 3 3 4 4

下一步是将输出转换为因子(因为在 R 中使用数字表示类别只是一种受虐狂)并生成有意义的关卡名称,因此基本上复制了实际cut的 .

于 2012-06-20T22:15:47.897 回答