如何获取多个向量并在 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”值也是如此。
我很想把所有int
s 和num
s 变成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 -> factor
和num -> 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 中记录它们的数据类型?的主要内容,如果未能解决你的问题,请参考以下文章