新手(初学者)学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阈值效应函数已经基本写好,目前正在测试中,估计过段时间就可以和大家见面了。

相关推荐
Scott9999HH2 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海3 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大7 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜7 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
执明wa7 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio