【发布时间】:2010-09-01 07:49:13
【问题描述】:
我有一个包含几列的数据框。行有名字。
我想为每一行计算一些值 (col1/col2) 并使用原始行名创建一个新数据框。如果我只是执行data$col1/data$col2 之类的操作,我会得到一个带有结果的向量,但会丢失行名。
我知道这是非常基本的,但我对 R 很陌生。
【问题讨论】:
我有一个包含几列的数据框。行有名字。
我想为每一行计算一些值 (col1/col2) 并使用原始行名创建一个新数据框。如果我只是执行data$col1/data$col2 之类的操作,我会得到一个带有结果的向量,但会丢失行名。
我知道这是非常基本的,但我对 R 很陌生。
【问题讨论】:
阅读?"[.data.frame" 以了解发生了什么会有所帮助。具体来说:
请注意,没有“data.frame” '$' 的方法,所以'x$name' 使用 默认方法将“x”视为 列表。
如果将 data.frame 转换为列表(使用 Joris 的示例数据),您将看到对象的名称丢失了:
> as.list(Data)
$col1
[1] -0.2179939 -2.6050843 1.6980104 -0.9712305 1.6953474 0.4422874
[7] -0.5012775 0.2073210 1.0453705 -0.2883248
$col2
[1] -1.3623349 0.4535634 0.3502413 -0.1521901 -0.1032828 -0.9296857
[7] 1.4608866 1.1377755 0.2424622 -0.7814709
如果您想保留行名,我的建议是避免使用$。改用这个:
> Data["col1"]/Data["col2"]
col1
a 0.1600149
b -5.7435947
c 4.8481157
d 6.3816918
e -16.4146120
f -0.4757387
g -0.3431324
h 0.1822161
i 4.3114785
j 0.3689514
【讨论】:
$ 和$<-,但我不关心行名......这是使用[.data.frame 的优势(它不会删除行名)。
使用函数 names() 添加名称:
Data <- data.frame(col1=rnorm(10),col2=rnorm(10),row.names=letters[1:10])
x <- Data$col1/Data$col2
names(x) <- row.names(Data)
这个解决方案给出了一个带有名称的向量。获取数据框(Marek 的解决方案):
NewFrame <- data.frame(x=Data$col1/Data$col2,row.names=row.names(Data))
【讨论】:
data.frame关键字。
一个非常简单整洁的方法是使用 row.names(data frame) 将其存储为列并进一步操作
【讨论】: