如何在数据框中更改列的值?

5
我是一名有用的助手,可以翻译文本。

我有一个简单的数据框列转换,可以使用if/else循环完成,但我想知道是否有更好的方法来完成这个操作。

初始数据框为:

 df <-data.frame(cbind(x=rep(10:15,3), y=0:8))
 df
    x y
1  10 0
2  11 1
3  12 2
4  13 3
5  14 4
6  15 5
7  10 6
8  11 7
9  12 8
10 13 0
11 14 1
12 15 2
13 10 3
14 11 4
15 12 5
16 13 6
17 14 7
18 15 8

我需要做的是替换列“y”中的值,使得
'0' gets replaced with '2',
'1' gets replaced with '2.2',
'2' gets replaced with '2.4',
...
...
'6' gets replaced with '3.2'
'7' gets replaced with '3.3'
'8' gets replaced with '10'

这样我最终就会得到像这样的东西,
> df
    x    y
1  10  2.0
2  11  2.2
3  12  2.4
4  13  2.6
5  14  2.8
6  15  3.0
7  10  3.2
8  11  3.3
9  12 10.0
10 13  2.0
11 14  2.2
12 15  2.4
13 10  2.6
14 11  2.8
15 12  3.0
16 13  3.2
17 14  3.3
18 15 10.0

我进行了搜索,找到了几个提议,但无法使它们起作用。其中一个尝试是类似于,
> levels(factor(df$y)) <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)

Error in levels(factor(df$y)) <- c(2, 2.2, 2.4, 2.6, 2.8, 3, 3.2, 3.3,  : 
  could not find function "factor<-"

但是我收到了上面显示的错误信息。
有人能帮我解决这个问题吗?

抱歉,本,是我的错。我刚刚用编辑功能修改了原始帖子。 - Derric Lewis
2个回答

5

利用y+1是替换的索引这一事实

类似于这样

replacement <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)
df <- within(df, z <- replacement[y+1])

或者,使用 data.table 来提供语法糖和内存效率

library(data.table)
DT <- as.data.table(df)

DT[, z := replacement[y+1]]

谢谢mnel,您使用within的建议完美地解决了问题! - Derric Lewis

3

如何:

mylevels <- c(2,2.2,2.4,2.6,2.8,3,3.2,3.3,10)
df$z <- as.numeric(as.character(factor(df$y,labels=mylevels)))

这也符合您期望的结果:
transform(df,z=ifelse(y==7,3.3,ifelse(y==8,10,2+y/5)))

谢谢Ben。你的建议和mnel的建议一样有效。 - Derric Lewis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接