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

Jok*_*oko 103 r vector dataframe

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

这是我的数据框:

> 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
Run Code Online (Sandbox Code Playgroud)

我试过了:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6
Run Code Online (Sandbox Code Playgroud)

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

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6
Run Code Online (Sandbox Code Playgroud)

任何帮助,非常感谢.

Ben*_*ker 143

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

as.numeric(df[1,])
Run Code Online (Sandbox Code Playgroud)

正如@Roland建议的那样,unlist(df[1,])将一行数据帧转换为数字向量而不删除名称.因此unname(unlist(df[1,])),获得相同结果的是另一种稍微更明确的方式.

  • 应该注意的是,数据帧已经是一个向量,因此as.vector看到它是模式"list"的向量并且什么都不做.为了便于理解底层机制,请尝试as.vector(df [1,],mode ="numeric"),这更具说明性.这就像as.numeric那样. (2认同)

Rol*_*and 40

我建议unlist,保留名称.

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

is.vector(unlist(df[1,]))
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

如果您不想要命名向量:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6
Run Code Online (Sandbox Code Playgroud)


sbh*_*bha 12

这是一个dplyr基于选项:

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

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()
Run Code Online (Sandbox Code Playgroud)


Chi*_*til 7

如果您不想更改为数字,可以尝试这样做.

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说没有多大意义:`str(as.vector(t(df)[,1]))`是`num [1:3] 1 2 2.6`,即你的代码**确实**转换结果到数字向量... (3认同)
  • 具体来说,当您使用t(df)时,R将数据帧强制转换为矩阵,在这种情况下为数字矩阵,因为所有元素都是数字。然后,[[,1]`提取第一列(一个数字向量,因为冗余维被自动删除)。as.vector()只会删除名称(您也可以使用unname()来删除名称)。 (2认同)
  • 我想说的是`unname(unlist(x))`解决方案要好一些(更有效,更透明)。 (2认同)

Rti*_*ist 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
Run Code Online (Sandbox Code Playgroud)

这是另一个示例(默认情况下 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"
Run Code Online (Sandbox Code Playgroud)

为了防止这种行为,您需要在提取之前处理该因素:

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"
Run Code Online (Sandbox Code Playgroud)