如何处理x必须是相关图中的数字误差?

时间:2019-07-05 21:19:51

标签: r correlation

我正在尝试为我的数据生成一个相关图,但是我得到“ x必须是数字错误”,其他修复不适用于我的情况。我也必须将月份更改为数字吗?还是有一种方法只为我的绘图选择数字列

尝试将所有数字转换为数字,但只是自动变回因子

getwd()
myDF <- read.csv("qbase.csv")
head(myDF)
str(myDF)

cp <-cor(myDF)
head(round(cp,2))

'data.frame':   12 obs. of  8 variables:
 $ Month                    : Factor w/ 12 levels "18-Apr","18-Aug",..: 5 4 8 1 9 7 6 2 12 11 ...
 $ Monthly.Recurring.Revenue: Factor w/ 2 levels "$25,000 ","$40,000 ": 1 1 1 1 1 2 2 2 2 2 ...
 $ Price.per.Seat           : Factor w/ 2 levels "$40 ","$50 ": 2 2 2 2 2 1 1 1 1 1 ...
 $ Paid.Seats               : int  500 500 500 500 500 1000 1000 1000 1000 1000 ...
 $ Active.Users             : int  10 50 50 100 450 550 800 900 950 800 ...
 $ Support.Cases            : int  0 0 1 5 35 155 100 75 50 45 ...
 $ Users.Trained            : int  1 5 0 50 100 300 50 30 0 100 ...
 $ Features.Used            : int  5 5 5 5 8 9 9 10 15 15 ...

dput(myDF)的结果如下:

  

dput( myDF)

structure(list(Month = structure(c(5L, 4L, 8L, 1L, 9L, 7L, 6L, 
2L, 12L, 11L, 10L, 3L), .Label = c("18-Apr", "18-Aug", "18-Dec", 
"18-Feb", "18-Jan", "18-Jul", "18-Jun", "18-Mar", "18-May", "18-Nov", 
"18-Oct", "18-Sep"), class = "factor"), Monthly.Recurring.Revenue = structure(c(1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("$25,000 ", 
"$40,000 "), class = "factor"), Price.per.Seat = structure(c(2L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("$40 ", 
"$50 "), class = "factor"), Paid.Seats = c(500L, 500L, 500L, 
500L, 500L, 1000L, 1000L, 1000L, 1000L, 1000L, 1000L, 1000L), 
    Active.Users = c(10L, 50L, 50L, 100L, 450L, 550L, 800L, 900L, 
    950L, 800L, 700L, 600L), Support.Cases = c(0L, 0L, 1L, 5L, 
    35L, 155L, 100L, 75L, 50L, 45L, 10L, 5L), Users.Trained = c(1L, 
    5L, 0L, 50L, 100L, 300L, 50L, 30L, 0L, 100L, 50L, 0L), Features.Used = c(5L, 
    5L, 5L, 5L, 8L, 9L, 9L, 10L, 15L, 15L, 15L, 15L)), class = "data.frame", row.names = c(NA, 
-12L))

4 个答案:

答案 0 :(得分:1)

您可以将日期转换为POSIXct,也可以删除美元符号以将第二和第三列转换为数字:

myDF$Month <- as.numeric(as.POSIXct(myDF$Month, format="%d-%b", tz="GMT"))
myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))

cp <-cor(myDF)

library(ggcorrplot)
ggcorrplot(cp)

答案 1 :(得分:0)

您正在尝试获取因子和数字列之间的相关性,不会发生这种情况(cor仅处理数字,因此会出现错误)。您可以这样做:

library(data.table)

ir <- data.table(iris) # since you didn't produce a reproducible example

ir[, cor(.SD), .SDcols = names(ir)[(lapply(ir, class) == "numeric")]]

里面有什么:

cor(.SD)将为由子数据表(.SD,请参阅?data.table组成的新数据帧计算相关矩阵。

.SDcols建立至此列将进入该子集data.table。它们只是类为numeric的那些。

答案 2 :(得分:0)

您可以删除美元符号,然后使用sapply将整数变量更改为数值,然后计算相关性。

myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))
newdf <-  sapply(myDF[,2:8],as.numeric)
cor(newdf)

编辑:

如果要使用month变量。请安装lubridate并使用月份功能。

例如:

library(lubridate)
myDF$Month<- month(as.POSIXct(myDF$Month, format="%d-%b", tz="GMT"))
myDF[,c(2,3)] <-  sapply(myDF[,c(2,3)], function(x) as.numeric(gsub("[\\$,]", "", x)))
newdf <-  sapply(myDF,as.numeric)
cor(as.data.frame(newdf))

答案 3 :(得分:0)

将这些月份转换为Date类的方法:

myDF$MonDt <- as.Date( paste0(myDF$Month, "-15"), format="%y-%b-%d")

也可以使用zoo::as.yearmon。两种方法都允许您应用as.numeric来获得有效的时间标度值。当使用单一年份数据时,其他答案就足够了,但是由于它们错误地假设前两位数字是月份中的某天而不是年份,因此它们将无法在任何多年数据集中提供有效的答案,但是会对此不会发出任何警告。

with(myDF, cor(Active.Users, as.numeric(MonDt) )  )
[1] 0.8269705

作为所示的其他答案之一,在as.numeric在货币格式的文本上成功使用之前,需要删除$和逗号。同样,这也是要素数据,因此as.numeric可能会产生错误的答案,尽管在此简单示例中不会。一种安全的方法是:

myDF[2:3] <- lapply(myDF[2:3], function(x) as.numeric( gsub("[$,]", "", x)))

myDF
    Month Monthly.Recurring.Revenue Price.per.Seat Paid.Seats Active.Users
1  18-Jan                     25000             50        500           10
2  18-Feb                     25000             50        500           50
3  18-Mar                     25000             50        500           50
4  18-Apr                     25000             50        500          100
5  18-May                     25000             50        500          450
6  18-Jun                     40000             40       1000          550
7  18-Jul                     40000             40       1000          800
8  18-Aug                     40000             40       1000          900
9  18-Sep                     40000             40       1000          950
10 18-Oct                     40000             40       1000          800
11 18-Nov                     40000             40       1000          700
12 18-Dec                     40000             40       1000          600
   Support.Cases Users.Trained Features.Used      MonDt
1              0             1             5 2018-01-15
2              0             5             5 2018-02-15
3              1             0             5 2018-03-15
4              5            50             5 2018-04-15
5             35           100             8 2018-05-15
6            155           300             9 2018-06-15
7            100            50             9 2018-07-15
8             75            30            10 2018-08-15
9             50             0            15 2018-09-15
10            45           100            15 2018-10-15
11            10            50            15 2018-11-15
12             5             0            15 2018-12-15

此问题的答案允许计算多个相关系数,并在一页上绘制双向数据关联:

How to add p values for correlation coefficients plotted using splom in lattice?