我有一个data.frame如下
> a <- c(98:103, 998:1003)
> b <- 1:length(a)
> data <- data.frame(a,b)
> data
a b
1 98 1
2 99 2
3 100 3
4 101 4
5 102 5
6 103 6
7 998 7
8 999 8
9 1000 9
10 1001 10
11 1002 11
12 1003 12
我想根据列a。
添加一列对于小于100的列,我将分配&#34; A&#34;到新栏目
对于&lt; 1000&gt; = 100的列a,我将分配&#34; B&#34;到新栏目
和&#34; C&#34;否则为
我的方法是
> data$c <- data$a
>
> A <- 1:99
> B <- 100:999
> for (i in 1:length(a)){
+ if (data[i,1] %in% A){
+ data[i,3] <- "A"
+ } else if (data[i,1] %in% B){
+ data[i,3] <- "B"
+ } else {data[i,3] <- "C"}
+ }
> data
a b c
1 98 1 A
2 99 2 A
3 100 3 B
4 101 4 B
5 102 5 B
6 103 6 B
7 998 7 B
8 999 8 B
9 1000 9 C
10 1001 10 C
11 1002 11 C
12 1003 12 C
>
虽然我的真实数据超过500,000行。我可以有更好的解决方案吗?
答案 0 :(得分:2)
使用data.table
在下面找到解决方案。如果您的key
变量(此处a
)不是数字,则此版本可能特别有用。
# Set up data
a <- c(98:103, 998:1003)
b <- 1:length(a)
# Set of values to look for
A <- 1:99
B <- 100:999
# Create data table and set key
DT <- data.table(a,b)
setkey(DT, a)
# Add new variable
DT[J(A), c:="a"]
DT[J(B), c:="b"]
DT[is.na(DT$c), c:="c"]
如果您的密钥变量不是数字,则可以将DT[J(A), c:="a"]
更改为DT[A,c:="a"]
。