如何获取多个向量并在 R 中记录它们的数据类型?

Posted

技术标签:

【中文标题】如何获取多个向量并在 R 中记录它们的数据类型?【英文标题】:How can I take multiple vectors and recode their datatypes in R? 【发布时间】:2010-12-02 03:08:43 【问题描述】:

我正在寻找一种优雅的方式来更改 R 中多个向量的数据类型。

我正在使用一个教育数据集:426 名学生对八个多项选择题的回答(1 = 正确,0 = 不正确),以及一个指示哪个讲师 (1, 2, or 3) 教授他们课程的列。

就目前而言,我的数据在data.df 中非常漂亮,如下所示:

    str(data.df)
    'data.frame': 426 obs. of  9 variables:
    $ ques01: int  1 1 1 1 1 1 0 0 0 1 ...
    $ ques02: int  0 0 1 1 1 1 1 1 1 1 ...
    $ ques03: int  0 0 1 1 0 0 1 1 0 1 ...
    $ ques04: int  1 0 1 1 1 1 1 1 1 1 ...
    $ ques05: int  0 0 0 0 1 0 0 0 0 0 ...
    $ ques06: int  1 0 1 1 0 1 1 1 1 1 ...
    $ ques07: int  0 0 1 1 0 1 1 0 0 1 ...
    $ ques08: int  0 0 1 1 1 0 1 1 0 1 ...
    $ inst  : num  1 1 1 1 1 1 1 1 1 1 ...

但那些ques0x 值并不是真正整数。相反,我认为最好让 R 将它们视为实验因素。 “inst”值也是如此。

我很想把所有ints 和nums 变成factors

理想情况下,一个优雅的解决方案应该生成一个数据框——我称之为factorData.df——看起来像这样:

    str(factorData.df)
    'data.frame': 426 obs. of  9 variables:
    $ ques01: Factor w/ 2 levels "0","1": 2 2 2 2 2 2 1 1 1 2 ...
    $ ques02: Factor w/ 2 levels "0","1": 1 1 2 2 2 2 2 2 2 2 ...
    $ ques03: Factor w/ 2 levels "0","1": 1 1 2 2 1 1 2 2 1 2 ...
    $ ques04: Factor w/ 2 levels "0","1": 2 1 2 2 2 2 2 2 2 2 ...
    $ ques05: Factor w/ 2 levels "0","1": 1 1 1 1 2 1 1 1 1 1 ...
    $ ques06: Factor w/ 2 levels "0","1": 2 1 2 2 1 2 2 2 2 2 ...
    $ ques07: Factor w/ 2 levels "0","1": 1 1 2 2 1 2 2 1 1 2 ...
    $ ques08: Factor w/ 2 levels "0","1": 1 1 2 2 2 1 2 2 1 2 ...
    $ inst  : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...

我相当肯定,无论你们想出什么解决方案,它都应该很容易推广到需要重新分类的任意 n 个变量,并且适用于最常见的转换(int -> factornum -> int,例如)。

不管你们提出什么解决方案,它必然比我的更优雅

因为我目前的笨拙代码只有 9 个单独的 factor() 语句,每个变量一个,像这样

 因子数据.df$ques01 

我是 R、编程和 *** 的新手。请温柔,并提前感谢您的帮助!

【问题讨论】:

@briandk:由于问题只能是正确的或不正确的,因此您最好将第 1-8 列转换为逻辑向量而不是因子。 (因素适用于,例如,多选题的答案,其中有超过 2 种可能性。) @Richie:感谢您的建议!我不熟悉向量中的逻辑数据类型。如果它们是像 nums、ints 和 factor 一样的数据类型,那么您的建议是只使用 lapply 将第 1-8 列转换为逻辑因子吗? 【参考方案1】:

This was also answered in R-Help.

我想有更好的方法可以做到这一点,但这里有两种选择:

# use a sample data set
> str(cars)
'data.frame':   50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
> data.df <- cars 

你可以使用lapply:

> data.df <- data.frame(lapply(data.df, factor))

for 声明:

> for(i in 1:ncol(data.df)) data.df[,i] <- as.factor(data.df[,i])

无论哪种情况,你都会得到你想要的:

> str(data.df)
'data.frame':   50 obs. of  2 variables:
 $ speed: Factor w/ 19 levels "4","7","8","9",..: 1 1 2 2 3 4 5 5 5 6 ...
 $ dist : Factor w/ 35 levels "2","4","10","14",..: 1 3 2 9 5 3 7 11 14 6 ...

【讨论】:

Shane,这正是我需要的基本功能。抱歉,我没有足够的声望点来支持它:-( @briandk:很高兴听到!在某个时候,只需接受它,这样社区就知道它回答了您的问题。 :)【参考方案2】:

我在plyr 包中找到了替代解决方案:

# load the package and data
> library(plyr)
> data.df <- cars

使用 colwise 函数:

> data.df <- colwise(factor)(data.df)
> str(data.df)
'data.frame':   50 obs. of  2 variables:
 $ speed: Factor w/ 19 levels "4","7","8","9",..: 1 1 2 2 3 4 5 5 5 6 ...
 $ dist : Factor w/ 35 levels "2","4","10","14",..: 1 3 2 9 5 3 7 11 14 6 ...

顺便说一下,如果你看一下 colwise 函数,它只使用lapply

df <- as.data.frame(lapply(filtered, .fun, ...))

【讨论】:

@Shane:我希望我也能“接受”这个,因为它结合了您的 lapply 建议和 plyr 包中的一些强大功能。

以上是关于如何获取多个向量并在 R 中记录它们的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

R语言数据结构-向量

将整数向量打印为十进制数

R语言数据对象类型

R语言 向量

R学习-6.Subsetting Vectors

PHP 如何从 AJAX 调用中发布多个数组/json 值并在同一个 SQL 查询中运行它们?