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

CSV conversion in R for standard calculations

我在计算从 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()?

数据集中的 header 行 ("character") 跨越前 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

除了@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