我有一个R数据框,看起来像:
x<-c(1:10)
df<-data.frame(x)
df['y']<-(df['x']>5)
这应该给我false x5, true x5
。
但是,当我执行此操作时,会将df['y']
重命名为x
。
如何在不重命名原始列标题的情况下进行我想要的评估?
由于
当我这样做时,我得到以下输出:
x x
1 1 FALSE
2 2 FALSE
...
10 10 TRUE
答案 0 :(得分:2)
让我们尝试各种列替换,看看会发生什么:
> x<-c(1:4) ; df<-data.frame(x) ;
> df
x
1 1
2 2
3 3
4 4
我就是这样做的 - 从另一列创建一个新列:
> df$y=df$x>2
> df
x y
1 1 FALSE
2 2 FALSE
3 3 TRUE
4 4 TRUE
第2版,按照方括号的方式获得作业:
> x<-c(1:4) ; df<-data.frame(x) ;
> df['y']=df$x>2
> df
x y
1 1 FALSE
2 2 FALSE
3 3 TRUE
4 4 TRUE
看起来很好,x和y列。现在检查一下我们的行为:
> x<-c(1:4) ; df<-data.frame(x) ;
> df['y']=df['x']>2
> df
x x
1 1 FALSE
2 2 FALSE
3 3 TRUE
4 4 TRUE
是的,两个x列。现在让我们从2开始尝试。
> x<-c(1:4) ; df<-data.frame(x) ;
> df$y=df['x']>2
> df
x x
1 1 FALSE
2 2 FALSE
3 3 TRUE
4 4 TRUE
再次两个x列。所以似乎是RHS触发了这一点。
解决方案是 double 方括号:
> df['x']
x
1 1
2 2
3 3
4 4
> df[['x']]
[1] 1 2 3 4
单个方括号可以为您提供数据框,从另一个数据框中分配数据框的一部分似乎会覆盖该名称。使用双括号只获取列值,因此名称不会改变:
> x<-c(1:4) ; df<-data.frame(x) ;
> df['y']=df[['x']]>2
> df
x y
1 1 FALSE
2 2 FALSE
3 3 TRUE
4 4 TRUE
当然,如果您知道应使用df$y
的文字名称,则在评估变量名称时只使用双方括号,例如:
> n="y"
> df[[n]]
[1] FALSE FALSE TRUE TRUE
额外逗号修复此问题的原因是因为使用两个索引进行索引会获得一个向量,一个索引(单个方括号)会为您提供数据框:
> df[,'x']
[1] 1 2 3 4
> df['x']
x
1 1
2 2
3 3
4 4