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

相关推荐
Matlab精灵1 分钟前
Matlab函数中的隐马尔可夫模型
开发语言·matlab·统计学习
Microsoft Word2 分钟前
c++基础语法
开发语言·c++·算法
数据小爬虫@4 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
qq_1728055912 分钟前
RUST学习教程-安装教程
开发语言·学习·rust·安装
wjs202419 分钟前
MongoDB 更新集合名
开发语言
monkey_meng23 分钟前
【遵守孤儿规则的External trait pattern】
开发语言·后端·rust
legend_jz1 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
tangliang_cn1 小时前
java入门 自定义springboot starter
java·开发语言·spring boot
程序猿阿伟1 小时前
《智能指针频繁创建销毁:程序性能的“隐形杀手”》
java·开发语言·前端
新知图书1 小时前
Rust编程与项目实战-模块std::thread(之一)
开发语言·后端·rust