我知道要从R中的数据框中获取一行,我们可以这样做:
data[row,]
其中row是整数。但这会产生一个丑陋的数据结构,其中每列都标有列名的名称。我怎样才能把它作为一个值列表来连接?
答案 0 :(得分:27)
通过从外部源导入数据创建的Data.frames将默认情况下将其数据转换为因子。如果您不想要此设置stringsAsFactors=FALSE
在这种情况下,要将行或列提取为向量,您需要执行以下操作:
as.numeric(as.vector(DF[1,]))
或者像这样
as.character(as.vector(DF[1,]))
答案 1 :(得分:13)
您不一定会将其作为vector
获取,因为每列可能具有不同的模式。您可能在一列中有numeric
,在下一列中有character
。
如果您知道整行的模式,或者可以转换为相同的类型,则可以使用模式的转换函数(例如,as.numeric()
)转换为向量。例如:
> state.x77[1,]
Population Income Illiteracy Life Exp Murder HS Grad Frost
3615.00 3624.00 2.10 69.05 15.10 41.30 20.00
Area
50708.00
> as.numeric(state.x77[1,])
[1] 3615.00 3624.00 2.10 69.05 15.10 41.30 20.00 50708.00
即使某些列为integer
,这也会有效,尽管它们会转换为numeric
个浮点数。
答案 2 :(得分:6)
你的建议存在问题;即数据框的组件(你称之为列)可以是不同的数据类型。如果你想要一行作为向量,那么它必须只包含一个数据类型 - 它们是原子向量!
以下是一个例子:
> set.seed(2)
> dat <- data.frame(A = 1:10, B = sample(LETTERS[1:4], 10, replace = TRUE))
> dat
A B
1 1 A
2 2 C
3 3 C
4 4 A
5 5 D
6 6 D
7 7 A
8 8 D
9 9 B
10 10 C
> dat[1, ]
A B
1 1 A
如果我们强制它删除空(列),R的唯一办法是将行转换为列表以维护不同的数据类型。
> dat[1, , drop = TRUE]
$A
[1] 1
$B
[1] A
Levels: A B C D
通过将数据框强制转换为矩阵,将数据框转换为通用类型的唯一合理解决方案。这可以通过data.matrix()
完成,例如:
> mat <- data.matrix(dat)
> mat[1,]
A B
1 1
data.matrix()
将因子转换为其内部数字代码。以上允许将第一行提取为矢量。
但是,如果您在数据框中有字符数据,那么唯一的办法就是创建一个字符矩阵,这可能有用也可能没用,现在data.matrix()
无法使用,我们需要{ {1}}代替:
as.matrix()
答案 3 :(得分:1)
怎么样?
library(tidyverse)
dat <- as_tibble(iris)
pulled_row <- dat %>% slice(3) %>% flatten_chr()
如果您知道所有值都是同一类型,请使用flatten_xxx
。
否则,我认为flatten_chr()
更安全。
答案 4 :(得分:0)
正如“恢复莫妮卡”用户所指出的,此问题分为两个部分:
unlist
之类的命令剥离data.frame“ shell”以创建矢量。 结合使用dplyr
和基数R,可以分两行完成。首先,mutate_all
将所有列转换为字符格式。其次,unlist
命令从data.frame结构中提取向量。
我的特别问题是csv的第二行包含了实际的列名。因此,我想将第二行提取到向量中,并使用它来分配列名。以下工作将行提取为字符向量:
library(dplyr)
data_col_names <- data[2, ] %>%
mutate_all(as.character) %>%
unlist(., use.names=FALSE)
# example of using extracted row to rename cols
names(data) <- data_col_names
# only for this example, you'd want to remove row 2
# data <- data[-2, ]
(注意:使用as.character()
代替unlist
也可以,但是两次应用as.character
不太直观。)