从数据框中获取一行作为R中的向量

时间:2011-09-30 19:58:48

标签: r

我知道要从R中的数据框中获取一行,我们可以这样做:

data[row,] 

其中row是整数。但这会产生一个丑陋的数据结构,其中每列都标有列名的名称。我怎样才能把它作为一个值列表来连接?

5 个答案:

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

正如“恢复莫妮卡”用户所指出的,此问题分为两个部分:

  1. 数据框通常在每一列中具有不同的数据类型,需要将其强制转换为字符串。
  2. 即使将列强制转换为字符格式,也需要通过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不太直观。)