将数据框架的一行转换为向量

我想从数据帧的一行中创建一个向量。但是我不希望必须使用行名和列名。我试了好几种方法,都没有成功。

这是我的数据框:

> 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
201460 次浏览

数据框架的列已经是向量了,你只需要把它们拉出来。请注意,将所需的列放在逗号后面,而不是放在逗号前面:

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

如果你真的想要一行,那么就按照本说的去做,并且请在将来正确地使用单词。

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

as.numeric(df[1,])

正如@Roland 建议的那样,unlist(df[1,])将把单行数据帧转换为数字向量,而不去掉名称。因此,unname(unlist(df[1,]))是获得相同结果的另一种稍微显式一些的方法。

正如下面@Josh 的评论,如果你有一个不完全数字(字母,因子,混合...)数据帧,你需要 as.character(df[1,])代替。

如果你不想变成数字,你可以试试这个。

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

我推荐 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

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

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"

下面是一个基于 dplyr的选项:

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


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