如何在R中减去两个相同结构的列表.以下函数创建数据集
dataSet <- function(x,y){
data <- lapply(1:4, function(x)
do.call(cbind,do.call(cbind,
lapply(lapply(1:5,function(y)
cbind(rnorm(10))), data.frame)) ))
pVariatesNames <- paste("s",seq(from=380, length.out=5),sep="")
nCasesNames <- c("Paper","R","G","B")
customerNames <- paste("Customer",seq(from=1, length.out=10),sep=" ")
names(data) <- nCasesNames
for(i in 1:4) {
colnames(data[[i]]) <- pVariatesNames
rownames(data[[i]]) <- customerNames
}
return(data)
}
dataSet1 <- dataSet(4,5); dataSet1
dataSet2 <- dataSet(4,5); dataSet2
Run Code Online (Sandbox Code Playgroud)
我想从dataSet2中减去dataSet1
我有一个文本文件,其中包含超过100,000行,我每周从SAP下载.它被下载为页面,每个页面包含相同的标题和虚线.下面是一个包含两个页面的最小示例,每个页面只包含两个项目
------------------------------------------------------------
|date |Material |Description |
|----------------------------------------------------------|
|10/04/2013 |WM.5597394 |PNEUMATIC |
|11/07/2013 |GB.D040790 |RING |
------------------------------------------------------------
------------------------------------------------------------
|date |Material |Description |
|----------------------------------------------------------|
|08/06/2013 |WM.4M01004A05 |TOUCHEUR |
|08/06/2013 |WM.4M010108-1 |LEVER |
------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我想要做的是将此文件导入到R中,只有一个标题,没有虚线.我试过了:
read.table( "myfile.txt", sep = "|", fill=TRUE)
Run Code Online (Sandbox Code Playgroud)
非常感谢
我想基于一列中的匹配来分配数据data.table, J()并且使用和!J()函数不匹配
library(data.table)
DT <- data.table(x = rep(c("a", "b", "c"), each=2000), y=c(rep(c(1,3,6), each = 1)) , key = c("x", "y"))
Run Code Online (Sandbox Code Playgroud)
我希望J()和!J()函数提供与下面代码相同的结果:
DT[J("b")][y !=1]
Run Code Online (Sandbox Code Playgroud)
我尝试了以下内容,它给出了以下错误:
DT[J("b")][!J(x, 1)]
Error in vecseq(f__, len__, if (allow.cartesian) NULL else as.integer(max(nrow(x), :
Join results in 1920000 rows; more than 4800 = max(nrow(x),nrow(i)). Check for duplicate key values in i, each of which join to the same group in x over and over again. If that's ok, try …Run Code Online (Sandbox Code Playgroud) 以下是显示问题的可重现示例:
openSummary <- read.table(textConnection(
"Dates dollarA numTotal
7/3/2011 52730.56 1614
7/10/2011 77709.43 1548"), header = TRUE)
openSummary$Dates <- strptime(openSummary$Dates,"%m/%d/%Y")
str(openSummary)
head(openSummary) # No problem
openSummaryDT <- data.table(openSummary)
str(openSummaryDT)
head(openSummaryDT) # An error is produced
Run Code Online (Sandbox Code Playgroud)
这是执行head时的错误(openSummaryDT)
Error in `rownames<-`(`*tmp*`, value = paste(format(rn, right = TRUE), :
length of 'dimnames' [1] not equal to array extent
Run Code Online (Sandbox Code Playgroud)
请解释错误,我该如何避免.但是,似乎我可以对数据帧和数据表进行一些操作,并得到相同的结果.
difftime(Sys.Date(), openSummary[ ,"Dates"])
difftime(Sys.Date(), openSummaryDT[ ,Dates])
Run Code Online (Sandbox Code Playgroud)
先感谢您
我想从列表中的列表中形成一个data.frame
L1 <- list(A = c(1, 2, 3), B = c(5, 6, 7))
L2 <- list(A = c(11, 22, 33), B = c(15, 16, 17))
L3 <- list(L1, L2)
L3
library(data.table)
Run Code Online (Sandbox Code Playgroud)
根据'data.table'手册:"'rbindlist'与do.call("rbind",l)相同,但更快"
我想用R base包来实现'rbindlist'的功能
rbindlist正是我需要的,但'do.call'却没有!
rbindlist(L3)
Run Code Online (Sandbox Code Playgroud)
do.call没有做我想做的事
do.call(rbind, L3)
identical(rbindlist(L3), do.call(rbind, L3))
Run Code Online (Sandbox Code Playgroud) 如果你能帮我解决以下两个问题,我将不胜感激:
除了'num'对象的第一个元素'0'之外,'for'循环起作用.因此,它在mySet中找不到任何以'0'开头的项目.
num <- c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100)
mySet <- c("0.C.A", "2.C.A", "4.C.A", "6.C.A", "8.C.A", "10.C.A", "15.C.A", "20.C.A",
"30.C.A", "40.C.A", "45.C.A", "50.C.A", "55.C.A", "60.C.A", "65.C.A", "70.C.A",
"80.C.A", "85.C.A", "90.C.A", "92.C.A", "94.C.A", "96.C.A", "98.C.A", "100.C.A")
varLoop <- c()
Grep <- function(num)grep(paste("^" , num, "\\.", sep=""), mySet, value = TRUE)
for(i in num){
varLoop[i] <- Grep(i)
print(varLoop[i])}
Run Code Online (Sandbox Code Playgroud)
下面的脚本会产生问题:
num <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), 2)
mySet <- c("0.C.A", "2.C.A", "4.C.A", "6.C.A", "8.C.A", "10.C.A", "15.C.A", "20.C.A",
"30.C.A", "40.C.A", "45.C.A", "50.C.A", "55.C.A", "60.C.A", "65.C.A", "70.C.A",
"80.C.A", "85.C.A", "90.C.A", …Run Code Online (Sandbox Code Playgroud) 根据评论编辑: OP想要计算:
(100 * (1 - 10 ^ - (Do - Do[Do==0] )) ? (1 - 10 ^ - (Do[Do==100] - Do[Do==0]) - Do
Run Code Online (Sandbox Code Playgroud)
对于的每个组合Cl,In,Sa在data.frame
-RS
我正在尝试将一个名为dG的函数应用于数据帧.由于函数的参数长度不同,回收产生了不可预测的结果.
为了解决这个问题,我将数据帧分成了列表,并尝试在使用名为"ids"的函数识别每个列表后,将dG函数(下面)应用于每个列表.
请让我首先提供显示问题的综合数据:
Do <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), each=16,times=16)
Cl <- rep(c("K", "Y","M","C"), each= 384, times=4)
In <- rep(c("A", "S"), each=3072)
Sa <- rep(c(1,2), each=1536)
Data <- rnorm(6144)
DataFrame <- cbind.data.frame(Do,Cl,In,Sa,Data); head(DataFrame)
rm(Do,Cl,In,Sa,Data)
attach(DataFrame)
DFSplit <- split(DataFrame[ , "Data"], list(Do, Cl, In, Sa))
Run Code Online (Sandbox Code Playgroud)
函数'ids'是一个帮助函数,用于标识列表名称
ids <- function(Do, Cl, …Run Code Online (Sandbox Code Playgroud) 如何让do.call(namespace:base)和rbindlist(namespace:data.table)表现相同.rbindlist消除了因子水平,而do.call则没有.以下显示了该问题
(dataList <- list(data.frame(f1=rep(c("a"), each=1),"c"=rnorm(2),"d"=rnorm(2)),
data.frame(f1=rep(c("b"), each=1),"c"=rnorm(2),"d"=rnorm(2))) )
(rbindlist.Data <- rbindlist(dataList)) # combines lists into ONE data.frame same as above
(do.call.Data <- do.call(rbind, dataList))
Run Code Online (Sandbox Code Playgroud)