将数据帧中的数字范围转换为R中的字符/因子?

时间:2015-12-03 09:54:42

标签: r

我有一个带数值数据的大数据框(x);前四行看起来像这样:

  A   B  C  D  E  F  G  H I  J  K   L   M  N  O   P  Q   R   S
1 -10  0  0  0 20 10 30 0 60 15 -10 -10 10 60 -10 60   0  60   0
2   0  0  0  0  0  0  0 0 60 15 -10 -10 10 60 -10 60  15  60  60
3   0  0  0  0  0  0  0 0 60 15 -10 -10 10 60 -10 60   0  60   0
4  10 20 30 40  0 10  0 0 60 15 -10 -10 10 60 -10  0 100 200 300

我想按照一些规则用字符替换值: S:0-9 P:10-14 L:15-29 我:30-59 R:> = 60

我试过了:

x[x < 10] <- "S"
x[x > 9 & x < 15] <- "P"
x[x > 14 & x < 30] <- "L"
x[x > 29 & x < 60] <- "I"
x[x > 60] <- "R"

我明白了:

  A  B C D E F  G H I  J K L M N  O P  Q   R  S
1  R R R R R 10 R R 60 R R R R 60 R 60   R 60  R
2  R R R R R  R R R 60 R R R R 60 R 60   R 60 60
3  R R R R R  R R R 60 R R R R 60 R 60   R 60  R
4 10 R R R R 10 R R 60 R R R R 60 R  R 100  R  R

但是当我尝试时:

x[x>60] <- 60
x[x<10] <- 0
x[x > 9 & x < 15] <- "P"
x[x == 0] <- "S"
x[x > 14 & x < 30] <- "L"
x[x > 29 & x < 60] <- "I"
x[x == 60] <- "R"

我得到了:

  A B C D E F G H I J K L M N O P Q R S
1 S S S S L P I S R L S S P R S R S R S
2 S S S S S S S S R L S S P R S R L R R
3 S S S S S S S S R L S S P R S R S R S
4 P L I I S P S S R L S S P R S S R R R

对此结果的任何暗示以及如何正确实现我的目标? 欢迎提出任何建议

1 个答案:

答案 0 :(得分:1)

基本上这里发生的是你打电话

x[x < 10] <- "S"

x不再是整数,而是某些列成为字符。然后你开始比较字符和整数,这会产生意想不到的结果:

> "I" > 60
[1] TRUE

有一个简单的方法:创建一个新的数据框y,在其中编写结果:

y = x

y[x < 10] <- "S"
y[x > 9 & x < 15] <- "P"
y[x > 14 & x < 30] <- "L"
y[x > 29 & x < 60] <- "I"
y[x >= 60] <- "R"

输出:

> y
  A B C D E F G H I J K L M N O P Q R S
1 S S S S L P I S R L S S P R S R S R S
2 S S S S S S S S R L S S P R S R L R R
3 S S S S S S S S R L S S P R S R S R S
4 P L I I S P S S R L S S P R S S R R R

请注意,我将您的>之一更改为>=以包含所有案例。

附录:数据

xx = "  A   B  C  D  E  F  G  H I  J  K   L   M  N  O   P  Q   R   S
1 -10  0  0  0 20 10 30 0 60 15 -10 -10 10 60 -10 60   0  60   0
2   0  0  0  0  0  0  0 0 60 15 -10 -10 10 60 -10 60  15  60  60
3   0  0  0  0  0  0  0 0 60 15 -10 -10 10 60 -10 60   0  60   0
4  10 20 30 40  0 10  0 0 60 15 -10 -10 10 60 -10  0 100 200 300"
x = read.table(text = xx, header = T)