我有一个带数值数据的大数据框(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
对此结果的任何暗示以及如何正确实现我的目标? 欢迎提出任何建议
答案 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)