我想R data.table基于ifelse()不同列的比较创建一个新列.但是,我希望该ifelse声明可以逐行应用.我已经尝试过使用组的by功能data.table,但它似乎应用了行的test条件,ifelse但是在列中的所有值中评估yes条件,而不是使用条件按行进行.下面是一个例子和我尝试过的一些解决方案.by
我有R data.table这样的:
> set.seed(45)
> DT <- data.table(date = c(rep("2018-01-01", 3), rep("2018-01-02", 3), rep("2018-01-03", 3)),
+ id = rep(letters[1:3], 3),
+ v1 = sample(x = -20:20, size = 9),
+ v2 = sample(x = -20:20, size = 9))
> str(DT)
Classes ‘data.table’ and 'data.frame': 9 obs. of 4 variables:
$ date: chr "2018-01-01" "2018-01-01" "2018-01-01" …Run Code Online (Sandbox Code Playgroud) 我们在 AWS 托管的 CentOS Linux 服务器上运行 RStudio Server。我们在服务器上有多个用户,每个用户都使用 RStudio Server。我们希望为所有用户提供一个通用路径来安装软件包,以便:
执行此操作的最佳程序是什么?
我提出的解决方案如下,但失败了:
保存我现有用户包的列表:
> save.pkg.list <- installed.packages()[is.na(installed.packages()[ , "Priority"]), 1]
> save(save.pkg.list, file="pkglist.Rdata")
Run Code Online (Sandbox Code Playgroud)
删除用户包:
> remove.packages(save.pkg.list)
Run Code Online (Sandbox Code Playgroud)
然后,我的想法是将软件包安装save.pkg.list到根目录下的文件夹中。似乎已经有一个共享文件夹/usr/share/R/library,其中包含我的库路径中的一个包:
.libPaths() [1] "/home/ursus/R/x86_64-redhat-linux-gnu-library/3.1" "/usr/lib64/R/library" "/usr/share/R/library"
Run Code Online (Sandbox Code Playgroud)
为了测试它,我尝试将一个包安装到共享文件夹中,看看服务器上的其他用户是否可以在他们的 R 实例中使用它。安装失败,很可能是因为它在 root 下,我假设我需要使用 sudo 权限(我拥有)但不确定如何将这些权限传递给 R 以进行软件包安装过程:
install.packages("dlm", lib = "/usr/share/R/library") Warning in install.packages : 'lib = "/usr/share/R/library"' is not writable
Run Code Online (Sandbox Code Playgroud)
最后,我假设需要对R_LIBS_SITE和R_LIBS_USER环境变量或类似的东西进行一些更改来控制默认的包安装/加载行为。但是,我还没到。
我正在尝试使用循环创建日期向量(格式化为字符串而不是日期)for.我已经回顾了其他一些SO问题,例如(如何使用循环创建字符串向量?),但它们没有帮助.我创建了以下for循环:
start_dates <- c("1993-12-01")
j <- 1
start_dates <- for(i in 1994:as.numeric(format(Sys.Date(), "%Y"))){
date <- sprintf("%s-01-01", i)
j <- j + 1
start_dates[j] <- date
}
Run Code Online (Sandbox Code Playgroud)
但是,它返回一个NULL (empty)向量start_dates.当我i手动增加索引时,它可以工作.例如:
> years <- 1994:as.numeric(format(Sys.Date(), "%Y"))
> start_dates <- c("1993-12-01")
> j <- 1
> i <- years[1]
> date <- sprintf("%s-01-01", i)
> j <- j + 1
> start_dates[j] <- date
> start_dates
[1] "1993-12-01" "1994-01-01"
> …Run Code Online (Sandbox Code Playgroud)