新手(初学者)学R语言第一课,从学正确导入数据开始

初看题目好像我在教你怎么导入数据,不不不,我是在教你正确的导入数据,不是说数据导入R就叫正确导入数据了。本章为新手教程,老手可以跳过。

这个内容早就想写了,今天有点空和大家聊一下。为什么R语言对于新手而言不太友好,有些人觉得R很难学。很多原因都有,我今天来说下没有正确导入数据的报错,比如下面报错

Error in xtfrm.data.frame(x) : cannot xtfrm data frames

这对新手来说绝对是个大打击,你根本没法找到原因,会影响及的积极性和学R的信心,因为我就是这么走过来的。

因为R语言是个注重格式的语言,目前导入数据的R包种类繁多,有些R包存在格式转换问题,所以导入数据后分析容易出现各种各样的问题。我以我一个粉丝发给我的数据和代码为例子,就是以我写得scitb5函数来做个亚组分析得交互表,分析的内容详见这篇文章《scitb5函数2.1版本(交互效应函数P for interaction)发布----用于一键生成交互效应表、森林图》

先导入R包和我写得函数

r 复制代码
library(tidyverse)
setwd("E:/公众号文章2024年/新手第一课,从学导入数据开始/scitb5")
source("./helper/21scitb5.R")

用我文章示例得代码导入数据

r 复制代码
d1 <- read.csv("zaochan.csv", sep = ",", header = TRUE)

设置协变量和交互变量,

r 复制代码
cov1        <- c("lwt", "smoke", "ptl", "ui", "ftv", "race")
interaction <- c("race", "smoke", "ui")

转换数据

r 复制代码
bc1 <- d1 %>%
  mutate(
    race = case_match(race,
                      "black" ~ 1,
                      "white" ~ 2,
                      "other" ~ 3
    )
  ) %>%
  mutate(smoke = if_else(smoke == "nonsmoker", 0, 1)) %>%
  mutate(across(c(race, low, ht, ui), factor))

最后使用我的sicitb5函数生成表,似乎一切很顺利,得出结果。

r 复制代码
out <- scitb5(data        = bc1, 
              x           = "age", 
              y           = "low", 
              Interaction = interaction, 
              cov         = cov1, 
              family      = "glm"
            )

下面咱们用readr包导入数据再跑一次

r 复制代码
library(readr)
d2 <- readr::read_csv("zaochan.csv")

好像几乎一样,没什么问题,但是还是不一样的

r 复制代码
bc2 <- d2 %>%
  mutate(
    race = case_match(race,
                      "black" ~ 1,
                      "white" ~ 2,
                      "other" ~ 3
    )
  ) %>%
  mutate(smoke = if_else(smoke == "nonsmoker", 0, 1)) %>%
  mutate(across(c(race, low, ht, ui), factor))

生成结果

r 复制代码
out <- scitb5(data        = bc2, 
              x           = "age", 
              y           = "low", 
              Interaction = interaction, 
              cov         = cov1, 
              family      = "glm"
)

同样的代码,换个导入数据方法就跑不出来了,而且这个报错你根本看不出来是什么回事,没办法修改。

有人可能会说这是我scitb5函数的bug,但其实不是是这句很普通代码的报错,一句涉及数据转换的代码,这句代码应该很常用,涉及很多场景,很多R包都会用

r 复制代码
length(levels(factor(bc2[,"low"]))) == 2

还有这句很普通的代码也会经常报错

r 复制代码
d2<-rbind(d2,d1)

也会有人会说这只是个小概率事件,但是这样的例子很多,两三页都翻不完

这只是一个小例子,还有其他很多千奇百怪的报错。

这样类似容易出错的R包还有readxl包,haven包等因为这些包可以直接导入excel文件,方便是方便了,但是有时会容易出现莫名其妙的错误。不是说这些包没有用,还是有很大用处的(比如在一些特殊的场景),但是对新手来说,稳定不容易出错才是他们目前最需要的。

因此正确的常规导入数据方法是很重要的

我推荐两种方法导入数据,这些都是我长期实践觉得比较稳定,不容易出错的,

第一:就是如果你是excel数据:

我们点:文件----另存为----csv格式

然后用R自带的格式导入,示例如下

r 复制代码
bc<-read.csv("E:/r/test/nahnesme.csv",sep=',',header=TRUE)

第二:如果是SPSS数据,咱们可以使用foreign包,如我乳腺癌的例子,to.data.frame=T这个一定要有,因为这句等于把数据转成数据框。

r 复制代码
library(foreign)
bc <- read.spss("E:/r/Breast cancer survival agec.sav",
                use.value.labels=F, to.data.frame=T)

上面这个报错在部分情况使用下面代码把数据强制转成数据框格式有一定几率也可以解决问题

r 复制代码
d2<-as.data.frame(d2)

但是对于新手来说,良好的数据导入习惯是成长很好的帮助。

其他数据以此参考,本期结束。

下面是个视频介绍

新手学R第一课,从学正确导入数据开始

最后和大家汇报一下,目前nhanes阈值效应函数已经基本写好,目前正在测试中,估计过段时间就可以和大家见面了。

相关推荐
AI浩1 分钟前
python Flask methods
开发语言·python·flask
在无清风11 分钟前
数据结构(期末)
java·开发语言
statistican_ABin12 分钟前
R语言数据分析案例40-华安中证基金多元线性回归和分析预测
数据分析·r语言·线性回归
极客代码14 分钟前
深入剖析Python中的Pandas库:通过实战案例全方位解读数据清洗与预处理艺术
开发语言·人工智能·python·pandas
大数据小朋友22 分钟前
Pand函数详解进阶:案例解析(第26天)
大数据·开发语言·数据仓库·python·pandas
H10038 分钟前
Kotlin中对空的很多处理
android·开发语言·kotlin
松仔log39 分钟前
Kotlin基础——异步和并发
android·开发语言·kotlin
多方通行82 小时前
UE5材质之HLSL:深度
开发语言·算法·ue5·图形渲染·材质
MessiGo2 小时前
Qt 实战(7)元对象系统 | 7.1、简介
java·开发语言·qt