我有一个数据框有几列。行有名字。关于操作数据帧的基本R问题
我想为每一行计算一些值(col1/col2
)并用原始行名创建一个新的数据框。如果我只是做类似data$col1/data$col2
的东西,我会得到一个结果向量,但是会丢失行名。
我知道这是很基本的,但我是很新的R.
我有一个数据框有几列。行有名字。关于操作数据帧的基本R问题
我想为每一行计算一些值(col1/col2
)并用原始行名创建一个新的数据框。如果我只是做类似data$col1/data$col2
的东西,我会得到一个结果向量,但是会丢失行名。
我知道这是很基本的,但我是很新的R.
这将有助于阅读?"[.data.frame"
明白发生了什么事情。具体做法是:
注意,没有“data.frame”为“$” 方法,因此“X $名称”使用这把“X”作为 列表 默认方法。
你会看到,当你转换一个data.frame到列表中的对象的名称丢失(使用里斯示例数据):
> as.list(Data)
$col1
[1] -0.2179939 -2.6050843 1.6980104 -0.9712305 1.6953474 0.4422874
[7] -0.5012775 0.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 <- 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'关键字。 – Marek 2010-09-01 10:02:07
@Marek:thx。我需要更多的咖啡... – 2010-09-01 10:13:03
一个非常简洁明快的办法是使用row.names(数据帧),保存为一列,并进一步操纵
Josh,[“姓名”]而不是$姓名的优势是什么?我倾向于使用后者,我发现你更喜欢前者。我的偏好只来自习惯,没有意识的决定。 – 2010-09-01 15:03:02
@JD我其实不喜欢前者。我经常使用'$'和'$ < - ',但我不关心行名......这是使用'[.data.frame'(它不会删除行名称)的优点。 – 2010-09-01 15:15:32
呵呵,你在回答中说'行名',但不知怎么它没有注册在我的头上。是的,我现在看到了。对不起,这么密集;) – 2010-09-02 15:41:52