【问题标题】:re-convert data types in R在 R 中重新转换数据类型
【发布时间】:2015-03-31 01:19:20
【问题描述】:

我在大型数据集中有一个数据子集,它不符合将数据读入 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

如果我使用 v5-v8 创建新的 df,如何自动将整个数据“重新转换”为适当的类型? (就像我从 csv 重新读取数据时 R 会做的那样)

【问题讨论】:

  • 你最初是怎么得到这个结果的?最好找到导致此问题的问题并修复它,这样您就不必再这样做了

标签: r type-conversion


【解决方案1】:

你可以试试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(正如 cmets 中提到的@Richard Scriven)

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

假设,您的数据集有很多发生这种情况的实例,split 数据集基于由 grepl 在删除标题行 (indx) 后创建的分组索引 (indx1) 并执行 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)

【讨论】:

  • 我之前实际上已经尝试过 type.convert(即在进入 stackoverflow 之前)使用 sapply 并将我所有的字符数据转换为数字,所以我认为这不是正确的选择。任何想法为什么?
  • @AlexR sapply 将输出转换为matrix,它只能保存一个class。因此,如果有任何字符列/元素,它将整个矩阵转换为character 类。 lapply 在这方面更安全,因为它将输出保存在列表环境中
  • 啊,我自己也应该意识到这一点。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2021-02-02
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多