有关操作数据帧的基本 R 问题

问题描述 投票:0回答:4

我有一个包含几列的数据框。行有名称。

我想计算每行的一些值(

col1/col2
)并使用原始行名称创建一个新的数据框。如果我只是做类似
data$col1/data$col2
的事情,我会得到一个包含结果的向量,但会丢失行名称。

我知道这是非常基础的,但我对 R 还很陌生。

r dataframe
4个回答
4
投票

阅读

?"[.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

2
投票

使用函数名称()添加名称:

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))

0
投票

使用 Transmute 来完成此操作。同时如果需要,还可以创建一个带有行名称的新列。

data <- tibble( col1 = rep(4, 5),
                col2 = rep(2, 5))
rownames(data ) <- as.character(c("red", "blue", "green", "black", "brown"))

data %>% transmute(new_col = col1/col2, row_names = row.names(.))


-1
投票

一个非常简单整洁的方法是使用 row.names(dataframe) 将其存储为列并进一步操作

© www.soinside.com 2019 - 2024. All rights reserved.