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

Sta*_*nLe 28 r

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

data[row,] 
Run Code Online (Sandbox Code Playgroud)

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

Dav*_* R. 30

通过从外部源导入数据创建的Data.frames将默认情况下将其数据转换为因子.如果你不想要这套stringsAsFactors=FALSE

在这种情况下,要将行或列提取为向量,您需要执行以下操作:

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

或者像这样

as.character(as.vector(DF[1,]))
Run Code Online (Sandbox Code Playgroud)

  • 不需要`as.vector`,`as.numeric(DF [1,])`和`as.character(DF [1,])`的作用相同. (13认同)
  • 我不知道 `stringsAsFactors` 与这个问题有多相关。 (2认同)

Mic*_*man 13

您不一定能将其视为a,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
Run Code Online (Sandbox Code Playgroud)

即使某些列是integers,这也可以工作,尽管它们会被转换为numeric浮点数.


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

如果我们强制它删除空(列),R的唯一办法是将行转换为列表以维护不同的数据类型.

> dat[1, , drop = TRUE]
$A
[1] 1

$B
[1] A
Levels: A B C D
Run Code Online (Sandbox Code Playgroud)

唯一的逻辑解决方案是通过将数据帧强制转换为矩阵来将数据帧转换为通用类型.这是通过data.matrix()例如:

> mat <- data.matrix(dat)
> mat[1,]
A B 
1 1
Run Code Online (Sandbox Code Playgroud)

data.matrix()将因子转换为其内部数字代码.以上允许将第一行提取为矢量.

但是,如果您在数据框中有字符数据,那么唯一的办法就是创建一个字符矩阵,它可能有用也可能没用,data.matrix()现在无法使用,我们需要as.matrix():

> dat$String <- LETTERS[1:10]
> str(dat)
'data.frame':   10 obs. of  3 variables:
 $ A     : int  1 2 3 4 5 6 7 8 9 10
 $ B     : Factor w/ 4 levels "A","B","C","D": 1 3 3 1 4 4 1 4 2 3
 $ String: chr  "A" "B" "C" "D" ...
> mat <- data.matrix(dat)
Warning message:
NAs introduced by coercion 
> mat
       A B String
 [1,]  1 1     NA
 [2,]  2 3     NA
 [3,]  3 3     NA
 [4,]  4 1     NA
 [5,]  5 4     NA
 [6,]  6 4     NA
 [7,]  7 1     NA
 [8,]  8 4     NA
 [9,]  9 2     NA
[10,] 10 3     NA
> mat <- as.matrix(dat)
> mat
      A    B   String
 [1,] " 1" "A" "A"   
 [2,] " 2" "C" "B"   
 [3,] " 3" "C" "C"   
 [4,] " 4" "A" "D"   
 [5,] " 5" "D" "E"   
 [6,] " 6" "D" "F"   
 [7,] " 7" "A" "G"   
 [8,] " 8" "D" "H"   
 [9,] " 9" "B" "I"   
[10,] "10" "C" "J"
> mat[1, ]
     A      B String 
  " 1"    "A"    "A" 
> class(mat[1, ])
[1] "character"
Run Code Online (Sandbox Code Playgroud)