R中的CSV转换用于标准计算

时间:2015-02-13 16:04:13

标签: r csv import mean

我在计算从this CSV file

导入的数据集的列平均值时遇到问题

我使用以下命令导入文件:

dataGSR = read.csv("ShimmerData.csv", header = TRUE, sep = ",",stringsAsFactors=T)
dataGSR$X=NULL #don't need this column

然后我把这个

的一部分
dati=dataGSR[4:1000,]

我检查它们是否正确

head(dati)
  Shimmer Shimmer.1 Shimmer.2        Shimmer.3 Shimmer.4        Shimmer.5 Shimmer.6        Shimmer.7
4   31329         0       713 623.674691281028      2545  3706.5641025641      2409 3529.67032967033
5   31649  9.765625       713 623.674691281028      2526 3678.89230769231      2501 3664.46886446886
6   31969  19.53125       712 638.528829576655      2528 3681.80512820513      2501 3664.46886446886
7   32289 29.296875       713 623.674691281028      2516  3664.3282051282      2498 3660.07326007326
8   32609   39.0625       711  654.10779696494      2503 3645.39487179487      2496 3657.14285714286
9   32929 48.828125       713 623.674691281028      2505 3648.30769230769      2496 3657.14285714286

当我输入

means=colMeans(dati)
Error in colMeans(dati) : 'x' must be numeric

为了解决这个问题,我将所有内容转换为矩阵

datiM=data.matrix(dati)

但是当我检查新变量时,数据值是不同的

head(datiM)
    Shimmer Shimmer.1 Shimmer.2 Shimmer.3 Shimmer.4 Shimmer.5 Shimmer.6 Shimmer.7
4     370         1        10         1        65        65         1         1
5     375      3707        10         1        46        46        24        24
6     381      1025         9         2        48        48        24        24
7     386      2162        10         1        36        36        21        21
8     392      3126         8         3        23        23        19        19
9     397      3229        10         1        25        25        19        19

我的问题是:

如何正确转换“dati”变量以执行colMeans()?

2 个答案:

答案 0 :(得分:1)

数据集中的标题行("字符")跨越前4行。我们可以skip 4行,使用header=FALSE,然后根据前4行的信息更改列名。

dataGSR <- read.csv('ShimmerData.csv', header=FALSE, 
             stringsAsFactors=FALSE, skip=4)
lines <- readLines('ShimmerData.csv', n=4)
colnames(dataGSR) <- do.call(paste,  c(strsplit(lines, ','), 
       list(sep="_")))
dataGSR <- dataGSR[,-9]

unname(colMeans(dataGSR))
# [1] 33004.2924 18647.4609   707.4335   718.3989  2521.3626  
#     3672.1383  2497.9013
# [8]  3659.9287

答案 1 :(得分:1)

除了@ akrun的建议之外,另一个选择是自己将列转换为numeric(而不是让read.csv执行此操作):

dati <- data.frame(
  lapply(dataGSR[-c(1:3),-9],as.numeric))
##
R> colMeans(dati)
   Shimmer  Shimmer.1  Shimmer.2  Shimmer.3  Shimmer.4  Shimmer.5  Shimmer.6  Shimmer.7 
33004.2924 18647.4609   707.4335   718.3989  2521.3626  3672.1383  2497.9013  3659.9287

使用dataGSR

读取stringsAsFactors=F的位置
dataGSR <- read.csv(
  file="F:/temp/ShimmerData.csv",
  header=TRUE,
  stringsAsFactors=F)

除非您确定character列需要factor,否则最好将此选项设置为FALSE