我有数百个 .csv 文件需要使用 fread 读取并另存为一个数据表。每个 .csv 的基本结构都相同。有需要跳过的标题信息(使用 skip = 很容易)。我很难跳过每个 .csv 文件的最后一行。每个 .csv 文件都有不同的行数。
如果我在 Test 文件夹中只有一个文件,这个脚本会完美地跳过第一行(使用 skip = )和最后一行(使用 nrows = ):
file <- list.files("Q:/Test/", full.names=TRUE)
all <- fread(file, skip = 7, select = c(1:7,9),
nrows = length(readLines(file))-9)
Run Code Online (Sandbox Code Playgroud)
在 Test 文件夹中保存多个文件时,这是我尝试的代码:
file <- list.files("Q:/Test/", full.names=TRUE)
L <- lapply(file, fread, skip = 7, select = c(1:7,9),
nrows = length(readLines(file))-9)
dt <- rbindlist(L)
Run Code Online (Sandbox Code Playgroud)
它不会创建 L 并给我这个错误:
Error in file(con, "r") : invalid 'description' argument
Run Code Online (Sandbox Code Playgroud)
关于如何在每个 .csv 的行数不同时跳过每个 .csv 的最后一行的任何想法?
我正在使用 data.table …
我有一个类似于此的数据表(除了它有150列和大约500万行):
set.seed(1)
dt <- data.table(ID=1:10, Status=c(rep("OUT",2),rep("IN",2),"ON",rep("OUT",2),rep("IN",2),"ON"),
t1=round(rnorm(10),1), t2=round(rnorm(10),1), t3=round(rnorm(10),1),
t4=round(rnorm(10),1), t5=round(rnorm(10),1), t6=round(rnorm(10),1),
t7=round(rnorm(10),1),t8=round(rnorm(10),1))
Run Code Online (Sandbox Code Playgroud)
哪个输出:
ID Status t1 t2 t3 t4 t5 t6 t7 t8
1: 1 OUT -0.6 1.5 0.9 1.4 -0.2 0.4 2.4 0.5
2: 2 OUT 0.2 0.4 0.8 -0.1 -0.3 -0.6 0.0 -0.7
3: 3 IN -0.8 -0.6 0.1 0.4 0.7 0.3 0.7 0.6
4: 4 IN 1.6 -2.2 -2.0 -0.1 0.6 -1.1 0.0 -0.9
5: 5 ON 0.3 1.1 0.6 -1.4 -0.7 1.4 -0.7 -1.3
6: …Run Code Online (Sandbox Code Playgroud) 我想有效地找到列表的所有组合,不包括每个元素与其自身的组合.例如,使用A,B,C,D列表查找除AA,BB,CC,DD之外的所有组合.
我可以使用这段代码看起来效率低下:
x <- c("A","B","C","D")
dt <- CJ(x,x)
dt <- dt[!V1==V2]
Run Code Online (Sandbox Code Playgroud)
问题是第三行的运行时间大约是第二行的4倍.因此,对于像我的真实数据这样的大型列表,第2行和第3行可能需要很长时间.
我在Windows 7上使用data.table 1.9.6,R 3.2.2和R Studio.
非常感谢.
我写了这个函数:
calculate_percentage = function(x){
for (i in 1:length(x)) {
x[i] = x[i]*100/x[length(x)]
return(x)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我将此功能应用于任何矢量时,它将不起作用。载体保持不变。但是,函数本身内部的循环可以正常工作。有人可以向我解释吗?