2015-01-31 21 views
0

我有一个大数据集中的数据子集,它不符合将数据读入到R时分配的原始数据类型。如何重新转换子集的数据类型的数据,就像R只会读取那个子集一样?在R中重新转换数据类型

示例:假设有一堆由变量1-4(v1到v4)组成的数据,另一组数据以列名v5到v8开始。

V1 V2 V3 V4 
1 32 a 11 a 
2 12 b 32 b 
3 3 c 42 c 
4 v5 v6 v7 v8 
5 a 43 a 35 
6 b 33 b 64 
7 c 55 c 32 

如果我创建一个新的DF与V5,V8,我怎么能自动“重新转换”整个数据适当的类型?

+0

你是怎么结束与摆在首位?可能最好找到引起这个问题并修复它,所以你不必再次这样做 – 2015-01-31 18:30:21

回答

6

(就好像我重新阅读从CSV的数据R会做),你可以尝试type.convert

df1 <- df[1:3,] 
str(df1) 
# 'data.frame': 3 obs. of 4 variables: 
# $ V1: chr "32" "12" "3" 
# $ V2: chr "a" "b" "c" 
# $ V3: chr "11" "32" "42" 
# $ V4: chr "a" "b" "c" 

df1[] <- lapply(df1, type.convert) 
str(df1) 
#'data.frame': 3 obs. of 4 variables: 
#$ V1: int 32 12 3 
#$ V2: Factor w/ 3 levels "a","b","c": 1 2 3 
#$ V3: int 11 32 42 
#$ V4: Factor w/ 3 levels "a","b","c": 1 2 3 

要子集dataset,你可以使用grep(如@Richard斯克里文提到的评论)

indx <- grep('^v', df[,1]) 
df2 <- df[(indx+1):nrow(df),] 
df2[] <- lapply(df2, type.convert) 

假设,你的数据集有许多情况下,这种情况发生时,split数据集基础上去除T后grepl创建分组指数(indx1)他标题行(indx)并在“列表”中执行type.convert

indx1 <- cumsum(grepl('^v', df[,1]))+1 
lst <- lapply(split(df[-indx,],indx1[-indx]), function(x) { 
       x[] <- lapply(x, type.convert) 
     x}) 

然后,如果你需要cbind列(假设nrow是所有列表中的元素一样)

dat <- do.call(cbind, lst) 
+0

我实际上已经尝试过使用sapply之前(即在进入stackoverflow之前)type.convert它转换所有我的字符数据到数字,所以我认为这不是正确的选择。任何想法为什么? – AlexR 2015-01-31 18:37:49

+2

@AlexR'sapply'将输出转换为'只能容纳一个'class'的矩阵。因此,如果有任何字符列/元素,它会将整个矩阵转换为“字符”类。 'lapply'在这方面比较安全,因为它保持列表环境中的输出 – akrun 2015-01-31 18:38:53

+0

啊,我本应该意识到这一点。谢谢 – AlexR 2015-01-31 18:41:58