【问题标题】:Convert a row of a data frame to vector将数据框的一行转换为向量
【发布时间】:2013-01-07 05:28:41
【问题描述】:

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

这是我的数据框:

> 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

【问题讨论】:

  • 我建议您正确格式化您显示的数据。看起来您缺少一些换行符。
  • 我想要一行。行 '1' 而不是列 'a'。
  • 有没有办法将此应用于数据帧的所有行,从而将所有向量合并为一个向量?
  • @stephanmg:像c(t(as.matrix(df)))这样的东西呢?
  • Andri:这行得通,虽然我也可以用不同的方式解决它。

标签: r vector dataframe


【解决方案1】:

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

as.numeric(df[1,])

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

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

【讨论】:

  • 它可能是 +1(或 0 反对票)给 OP,因为它提供的代码清楚地说明了他们想要什么,即使问题的文本和标题是乱码......
  • @ChinmayPatil,他们还有哪些其他选择?他们的代码示例当然看起来就是他们想要的。
  • 应该注意,数据框已经是一个向量,因此 as.vector 认为它是模式“list”的向量并且什么都不做。为了便于理解底层机制,请尝试 as.vector(df[1,], mode="numeric") ,它更具说明性。这就是 as.numeric 所做的。
  • 没问题。我只是说对于这个问题他们给出了完全相同的答案。
  • 在此期间可能已经更改,但今天 unlist 允许删除名称:identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,]))(顺便说一句,df 仍然不是 data.frame 的合理名称... ;-))跨度>
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这是一个基于 dplyr 的选项:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 这对我来说没有多大意义:str(as.vector(t(df)[,1]))num [1:3] 1 2 2.6,即您的代码确实将结果转换为数字向量 ...
      • 具体来说,当您使用t(df) 时,R 会将数据框强制转换为矩阵,在本例中为数字矩阵,因为所有元素都是数字。然后[,1] 提取第一列(一个数字向量,因为冗余维度被自动删除)。 as.vector() 只是去掉名字(你也可以用 unname() 做)。
      • 它似乎也适用于角色。但是关于强制,你是对的。 FWIW,我的解决方案也适用于字符数据帧.. 需要注意的是所有数据都将转换为字符
      • 我会说unname(unlist(x)) 解决方案要好一些(更高效、更透明)。
      • as.vector(t(df)[,1]) 我喜欢它!正是我需要的!
      【解决方案5】:

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

      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"
      

      【讨论】:

        【解决方案6】:

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

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

        如果你真的想要排,那就照本说的做,以后请正确使用单词。

        【讨论】:

        • 但我认为 OP 想要第一行 row
        • @BenBolker 也许是这样......我只是假设他想要他的头衔和问题所说的他想要的。
        猜你喜欢
        • 2011-02-02
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2017-09-25
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        相关资源
        最近更新 更多