R:数据帧中列的数据转换

时间:2014-05-12 06:48:41

标签: r dataframe data.table

我有一个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行。我可以有更好的解决方案吗?

1 个答案:

答案 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"]