1 初见

1.1 升级 R 时如何重装包 https://d.cosx.org/d/420250-ubuntu16-04-r-3-5

先把已安装的包的名称存下来就行了吧。

saveRDS(installed.packages(), 'pkg.rds')

重装完 R 之后,再载入一下:

pkg <- readRDS('pkg.rds')
pkg[ ,1]

批量安装:

install.packages(pkg[, 1])

另外,听说 ‘installr’ 包不错,不妨试试。

@earclimate#429307 按照 @dapengde#429308 好做法先保存下来已经安装的 R 包名称。 楼主 Ubuntu 的环境,installr 的方式不可用,它只管 Windows 环境,升级 R 请看

sudo apt-add-repository -y "deb https://cloud.r-project.org/bin/linux/ubuntu bionic-cran35/"
# 或者就近的镜像站点
sudo apt-add-repository -y "deb https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/linux/ubuntu bionic-cran35/"
# 必须导入 key 
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E084DAB9
sudo apt-get update
sudo apt-get install r-base r-base-dev
# 添加二进制编译好的R包仓库,有些R包依赖复杂,编译时间长
# R 3.5.x 系列 二进制 R 包
sudo add-apt-repository ppa:marutter/c2d4u3.5
sudo apt-get update

我怀疑楼主没有导入 key, 如果你还有时间不妨看看 https://cran.r-project.org/bin/linux/debian/index.html

更多安装的坑请看 https://notesdown.netlify.com/command-line.html#r

1.2 win10下Rstudio切换中文输入法问题 https://d.cosx.org/d/419556-win10-rstudio

win10 专业版下rstudio切换中文输入法有时候切换不了,需要在其他地方先过度下,比如打开个txt文档使得输入法能正常切换了,再进入rstudio中才基本解决问题,可是这么以来老纠结了啊,请教各位坛友如何解决?


同样饱受折磨,我自己的处理是 徽标键+D,两下,然后再切换中文

我的办法是在虚拟机或者docker内装RStudio Server ,在浏览器里操作,可绕开不少问题,虽然刚开始的配置过程有点麻烦,建议大家趁早走这条路线,别再为这类问题纠结,资源占用不见得多多少,我的体验很流畅

2 数据

2.1 $与[]的区别与应用 https://d.cosx.org/d/420373

$与[]有什么区别?各自有什么优缺点?


$是用元素名提取单个成员的写法,[]是用元素位置提取单个或以上成员的写法。

3 作图

4 拟合

5 循环

5.1 改进 for 循环 https://d.cosx.org/d/420414-for

有三组向量,用for 循环分别遍历每一组向量,代码如下:

x <- c(1, 2)
y <- c(3, 4, 5)
z <- c(6, 7, 8, 9)
for(i in x){
    for(j in y){
        for(k in z){
            sum <- i + j + k
            print(sum)
        }

    }
}

能否使用其他函数改写for循环,使代码运行更快?


这就相当于求个全排列:

expand.grid(x = c(1, 2), y = c(3, 4, 5), z = c(6, 7, 8, 9))

5.2 R多重for循环的加速问题 https://d.cosx.org/d/420387-r-for

在训练模型的时候,有时候需要对同一个模型,采用不同条件的训练,这时候需要使用多重for循环将不同的条件放入到同一个模型中,模型的整体训练速度比较慢,在网上查到一列资料,例如foreach + doParallel 多核并行方案,但是好像不能解决多重for 循环的问题? 有没有哪位朋友有比较好的解决方案。


将所有参数的组合构成一个参数的数据框(参考expand.grid())。这样对参数数据框做一层循环或者apply一次就够了,然后就可以并行了

a = rep(1:3,each=2)
b = rep(5:6,times=3)
dataframe = data.frame('a'=a,'b'=b)
dataframe
##   a b
## 1 1 5
## 2 1 6
## 3 2 5
## 4 2 6
## 5 3 5
## 6 3 6
apply(dataframe, 1, function(x){
a1 = x[[1]]
b1 =x[[2]]
return(c(a1,b1))
})
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    1    2    2    3    3
## [2,]    5    6    5    6    5    6

6 分支

6.1 如何画分段函数 https://d.cosx.org/d/420402-r

假设有这样一个分段函数y = 2(0<x<1),y = 0.1(1<x<2),y = -1(2<x<5)


方法 1:

简单粗暴的写法, 为了X的区间连续加上了x=0,x=1 x=2的边界

f = function(x) {
  sapply(x, function(x) {
    y = numeric()
    if (x >= 0 & x < 1)
      y = 2
    else if (x >= 1 & x < 2)
      y = 0.1
    else if (x >= 2 & x < 5)
      y = -1
    return(y)
  })
}

x = seq(0, 5, 0.1)

plot(x, f(x))

方法 2:

x <- seq(-1, 10, 0.1)
y <- ifelse(x > 0 & x < 1, 2, ifelse(x > 1 & x < 2, 1, ifelse(x > 2 & x < 5, -1, NA)))
plot(x, y)

方法 3:

x = seq(0, 500, 0.1)
y <- (x > 0 & x < 1) * 2 +
(x > 1 & x < 2) * 1 +
(x > 2 & x < 5) * -1

7 办公

8 习题

8.1 怎样向别人求助 https://d.cosx.org/d/1553-1553

我在论坛发帖求助,可是求助帖发布之后,为什么没人理我?


发帖求助时,提问者请把自己的问题交代清楚,节省大家的时间,不要没有前因后果、没有上下文,让别人看了你的问题还得继续追问。很差的问题如“我的R出错了,请问我该怎么办?”;你得告诉别人在怎样的情况下出错了以及出了什么错。

一个好的问题应当包括以下两个部分:

下面提供一个样板,看看一个提问帖怎样能修改得更容易得到帮助。

标题: 如何将数字转化为时间格式

修改后标题: 如何将 5, 930, 2235 这样格式的数字转换为 0:05, 9:30, 22:35 这样格式的时间

(从原标题看不出这究竟是个提问帖还是个经验总结帖。修改后,即使不用看正文,也一眼就看清具体问题是什么。)

正文:

~~大家好

我有一列从0-2355的数字,我希望把它们转换成0:00, 23:55这样的时间格式

尝试了 times <- format(otter$time, format = “%h-%m”)

或是运算otter$time <- as.numeric(substr(otter[,3],1,2))*60 + as.numeric(substr(otter[3,],3,4))

都没有成功,请问有什么方法可以实现转换?

谢谢。~~

修改后正文:

问题描述

我有一列格式为一到四位数的数字,如 0, 2355 等,我希望把它们转换成 0:00, 23:55 这样的时间格式,但没有成功。

(简单描述清楚问题和预期结果即可,如果可能,请尽量提供上下文方便理解)

我的代码、数据和运行结果

为了解决这个问题,我进行了如下测试,得到的都不是预期结果:

mydata = read.csv("data.csv")
format(mydata, format = "%h-%m")
as.numeric(substr(mydata,1,2))*60 + as.numeric(substr(mydata,3,4))
dput(mydata) 
sessionInfo()

(按markdown格式提供代码即可,另外R的代码可使用dput()函数分享数据或reprex包的reprex::reprex()函数创建可重复例子, 具体见#5 扩展阅读部分的求助帖该怎么写,才能吸引别人来帮忙)

我的系统环境

sessionInfo()
#> R version 3.5.1 (2018-07-02)
#> Platform: x86_64-w64-mingw32/x64 (64-bit)
#> Running under: Windows 7 x64 (build 7601) Service Pack 1
#> 
#> Matrix products: default
#> 
#> locale:
#> [1] LC_COLLATE=Chinese (Simplified)_People's Republic of China.936 
#> [2] LC_CTYPE=Chinese (Simplified)_People's Republic of China.936   
#> [3] LC_MONETARY=Chinese (Simplified)_People's Republic of China.936
#> [4] LC_NUMERIC=C                                                   
#> [5] LC_TIME=Chinese (Simplified)_People's Republic of China.936    
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> loaded via a namespace (and not attached):
#>  [1] compiler_3.5.1    magrittr_1.5      htmltools_0.3.6  
#>  [4] tools_3.5.1       yaml_2.2.0        Rcpp_0.12.18     
#>  [7] stringi_1.2.4     rmarkdown_1.10.13 knitr_1.20       
#> [10] htmldeps_0.1.1    digest_0.6.17     stringr_1.3.1    
#> [13] evaluate_0.11

(在 R 里运行 sessionInfo() 函数,将返回的信息贴出来。目的是提供更多运行环境的信息以更好地定位问题所在。)

8.2 向别人求助时如何提供自己的代码 https://d.cosx.org/d/420240--

下面的小技巧,告诉你如何把你的代码快捷优雅地贴出来。

仍然以上面的帖子为例,假如你出问题的代码是这样的:

mydata = read.csv("data.csv")
format(mydata, format = "%h-%m")
as.numeric(substr(mydata,1,2))*60 + as.numeric(substr(mydata,3,4))

要想别人重现你的故障,别人需要知道代码里用到的数据 mydata 是什么。上面这种情况,为了让别人没拿到 data.csv 文件也能正常运行你的后续代码,可以在上面的代码后面添加一条 dput()函数即可。

为了省事,系统环境报告函数也可以附在后面。所以,你要分享的代码应该改为:

mydata = read.csv("data.csv")
format(mydata, format = "%h-%m")
as.numeric(substr(mydata,1,2))*60 + as.numeric(substr(mydata,3,4))
dput(mydata)
sessionInfo()

然后,选中上面这些所有要分享的代码行,ctrl+c,再运行 reprex() 函数,这样就把代码和运行结果都存进了剪贴板,ctrl+v 贴到你的帖子里就行了。

9 函数

9.1 R语言包的本地安装加载问题 https://d.cosx.org/d/420395-r

用朋友下载好的R包的压缩包,想通过解压到下载的R中library文件夹下直接在R和RStudio中使用,但是不知道为何解压了,在R中仍不能使用!


需要安装才能用。 RStudio - Tools - Install Packages - Install from: Package Archive File

除非你的R包是直接从另一台电脑的library拷过来,这样直接丢进library可能直接可以使用。

10 字符

10.1 求推荐一本关于正则表达式的书籍 https://d.cosx.org/d/420410

我是一个没写过正而八经的正则表达式的人,是一枚小白,各位能否推荐一本适合入门的有关正则表达式的书,语言不限?最好是R语言,其次是 Python 语言或者别的也可以。首先是适合入门,其次是语言环境。


11 地图

12 时间

12.1 如何将数字转化为时间格式 https://d.cosx.org/d/420238--

我有一列从0-2355的数字,我希望把它们转换成0:00, 23:55这样的时间格式

尝试了 times <- format(otter\(time, format = "%h-%m") 或是运算otter\)time <- as.numeric(substr(otter[,3],1,2))*60 + as.numeric(substr(otter[3,],3,4))

都没有成功,请问有什么方法可以实现转换?


format(strptime(2235, format = "%H%M"), format = "%H:%M")

或者

x <- c(5, 2235)
xhour <- x %/% 100
xmin <- x %% 100
xmin[xmin < 10] <- paste0("0", xmin[xmin < 10])
paste(xhour, xmin, sep =":")

13 批量

13.1 用数组的方式批量读入上千个有规律文件名txt文件 https://d.cosx.org/d/420392-r-txt

因为文件里的数据都是相同的字段。想以用3维数组的方式读取每个文件的数据并进行简单的求和运算。以文件名为维度,然后里面的数据为数据框。不知道如何实现。


# list files with pattern
filel = list.files("../dataset/out/", pattern = "fix3_1.61*", full.names=TRUE)
# read all files into a list, each element is a data.frame
data.l = lapply(filel, data.table::fread)

beginr 包开发版 (github: pzhaonet/beginr) 里有个函数,批量读入指定文件夹里的所有结构相同的文本文件,作为 list 或 data.frame ,而源文件的文件名作为 list 里的 name 或者 data.frame 的新列来存放:

beginr::readdir()

并没有读成三维数组。我觉得作为 list 或 data.frame 保存更为直观一些,后续处理也更方便,尤其是存为 data.frame 时,源文件名作为新列,这样就可以直接用 tapply() 以及 tidyr 的 gather()spread() 函数折腾了。

14 写书

15 建网

16 应用

17 统计

17.1 关于t test的问题 https://d.cosx.org/d/420346-t-test

从某大学随机抽取200名学生,发现他们每年平均阅读量为20本书。已知该大学平均阅读量为12本每年,标准差为2.9。现在,假设我们又一次随机抽取40名学生,可以考虑样本均值比20本每年更多,更少,还是相等?


第一次抽样的样本均值为20本,总体均值是12,现在有第二次抽样,样本是40名学生。我想问的是第二次抽样的均值与第一次抽样的均值一样的可能性大小。如果用t test,第一次抽样的均值可以拒绝 样本均值与总体均值大小一样的假设。基于这样的假设,我认为第二次抽样的结果应该是与样本均值有显著性差异,但问题是如何检验第二次抽样与第一次抽样的均值是否有显著性差异

谢谢,弄清楚了,根据中心极限定理,样本数越大,样本均值越接近总体均值。所以第二次样本数只有40名学生,数量少于第一次抽取的200个样本,因此相比第一次抽样,第二次样本均值为20本每年的可能性更大