将数据框的一行转换为矢量


116

我想从数据帧的一行中创建一个向量。但是我不需要行名和列名。我尝试了几件事...但是没有运气。

这是我的数据框:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

我试过了:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

但是我真的想要这样的东西:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

我建议您格式化已正确显示的数据。看起来您缺少一些换行符。
Chinmay Patil

我要排。行“ 1”而不是列“ a”。
Joko 2013年

有没有一种方法可以将其应用于数据帧的所有行,从而将所有向量合并为单个向量?
stephanmg

1
@stephanmg:怎么样 c(t(as.matrix(df)))
Andri Signorell

安德烈:那行得通,尽管我也可以用不同的方式解决它。
stephanmg

Answers:


154

从数据框中提取一行时,您将获得一个单行数据框。将其转换为数值向量:

as.numeric(df[1,])

正如@Roland所建议的那样,unlist(df[1,])无需删除名称即可将单行数据帧转换为数字矢量。因此,这unname(unlist(df[1,]))是获得相同结果的另一种更为明确的方法。

就像下面的@Josh注释一样,如果您有一个不完全数字(字母,因子,混合...)的数据框,则需要as.character(df[1,])


即使问题的文本和标题出现乱码,也可能向OP提供+1(或0票)的代码,以清楚地说明他们想要的代码……
Ben Bolker

@ChinmayPatil,他们还有其他选择吗?他们的代码示例确实使它看起来像他们想要的那样。
Ben Bolker

2
应该注意的是,数据帧已经是一个向量,因此正如向量所看到的,它是模式为“列表”的向量,并且什么也不做。为了促进对基本机制的理解,请尝试使用as.vector(df [1,],mode =“ numeric”)进行说明。这就是as.numeric所做的。

1
没问题。我只是说,对于这个问题,他们给出的答案完全相同。
本博克

1
在此期间可能有所更改,但是今天unlist允许删除名称:( identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) 而且btw df仍然不是data.frame的明智名称... ;
Andri Signorell

45

我建议使用unlist,保留名称。

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

如果您不想使用命名向量:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

如果您不想更改为数字,则可以尝试此操作。

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
这对我来说没有多大意义:str(as.vector(t(df)[,1]))num [1:3] 1 2 2.6,即您的代码确实将结果转换为数值向量...
Ben Bolker

2
具体来说,当您使用t(df)R将数据帧强制转换为矩阵时,由于所有元素都是数字,因此在这种情况下为数字矩阵。然后[,1]提取第一列(一个数字向量,因为冗余维会自动删除)。as.vector()只是删除名称(您也可以使用unname())。
Ben Bolker

它似乎也适用于角色。但是你对胁迫是正确的。FWIW,我的解决方案也将适用于角色数据帧..将所有数据转换为角色的注意事项
Chinmay Patil 2013年

2
我会说unname(unlist(x))解决方案要好一些(更有效,更透明)。
Ben Bolker

as.vector(t(df)[,1])我喜欢它 !正是我需要的!
Uther Pendragon 2015年

7

这是一个dplyr基本选项:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

请注意,如果您的行包含一个因子,则必须小心。这是一个例子:

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

这是另一个示例(默认情况下,data.frame()将字符转换为因数)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

为防止此行为,在提取它之前,您需要照顾该因素:

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

数据帧的列已经是向量,您只需要将它们拉出即可。请注意,将所需的列放在逗号之后,而不是之前:

> newV <- df[,1]
> newV
[1] 1 2 4 2

如果您确实想要排行,请按照Ben所说的去做,请将来正确使用单词。


但我认为OP想要第一吗?
Ben Bolker

1
@BenBolker也许是这样...我只是假设他想要他的头衔和问题说的他想要的。
乔纳森·克里斯滕森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.