用另一个索引值替换数据集值r

时间:2016-05-23 20:29:58

标签: r dataset

我有以下数据集

head(data)

  from  to
1    1   2
2    2   3
3    2  17
4    3   4
5    4   5
6    4 855

我有这个数据集

 > head(names)
           V1
1    Greenock
2     Glasgow
3     Preston
4  Birmingham
5 Southampton
6          Le

现在我想要的很容易:

head(data)

         from            to
1    Greenock     Glasgow
2    Glasgow      Preston
3    Glasgow      17 (you got the point)
4    Preston      Birmingham
5    Birmingham   Southampton
6    Birmingham   855

我尝试了这种旧式的循环,但是

> for(i in 1:nrow(data)){
+ data$from[i] <- names$V1[data$from]
+ data$to[i] <- names$V1[data$to]
+ }
  1. 效果不佳
  2. 我知道这不是一件好事
  3. 有什么想法吗?

2 个答案:

答案 0 :(得分:2)

R factor是针对此类数据制作的。它将数据保存为数字,但添加人类可读的level

我只想将fromto列转换为factor s:

data$from <- factor(data$from)
data$to <- factor(data$to)

然后更改关卡的标签:

levels(data$from) <- names$V1
levels(data$to) <- names$V1

以上代码适用于我:

data <- data.frame(
 from = 1:10,
 to = seq(from=10, to=1, by=-1))

names <- data.frame(
  V1 = c('a','b','c','d','e', 'f','g','h','i','j'))

data$from <- factor(data$from)
data$to <- factor(data$to)

levels(data$from) <- names$V1
levels(data$to) <- names$V1

print(data)

结果:

   from to
1     a  j
2     b  i
3     c  h
4     d  g
5     e  f
6     f  e
7     g  d
8     h  c
9     i  b
10    j  a

这个答案确实假设您为每个号码都有一个标签。如果不是这种情况,通常意味着数据出现问题,并且您希望抛出错误。您应该使用Hadley的断言包中的max(data[,c('to','from')]) <= nrow(names)或(更好)stopifnot断言assert_that(未经测试)。

如果你不想做这个假设,你应该使用@ RichardScriven的答案。

答案 1 :(得分:1)

这是一种方法,使用一些逻辑子集和replace()

dlg <- data <= nrow(names)
replace(data, dlg, as.character(names$V1)[unlist(data)][dlg])
#         from          to
# 1   Greenock     Glasgow
# 2    Glasgow     Preston
# 3    Glasgow          17
# 4    Preston  Birmingham
# 5 Birmingham Southampton
# 6 Birmingham         855

顺便说一句,datanames都是重要基本函数的名称,因此您可能希望重命名数据集。