data.table包在速度方面非常有用.但我实际上在使用线性回归的输出时遇到了麻烦.是否有一种简单的方法可以使data.table输出与plyr包中的输出一样漂亮/有用?以下是一个例子.谢谢!
library('data.table');
library('plyr');
REG <- data.table(ID=c(rep('Frank',5),rep('Tony',5),rep('Ed',5)), y=rnorm(15), x=rnorm(15), z=rnorm(15));
REG;
ddply(REG, .(ID), function(x) coef(lm(y ~ x + z, data=x)));
REG[, coef(lm(y ~ x + z)), by=ID];
Run Code Online (Sandbox Code Playgroud)
data.table系数估计值在单列中输出,而plyr/ddply系数估计值在多个且标记良好的列中输出.
我知道我可以用data.table运行三次回归,但这似乎效率很低.不过我可能错了.
REG[, Intercept=coef(lm(y ~ x + z))[1],
x =coef(lm(y ~ x + z))[2],
z =coef(lm(y ~ x + z))[3], by=ID];
Run Code Online (Sandbox Code Playgroud) 我正在尝试生成一个排除某些"不良数据"的随机样本.在我对其进行采样之前,我不知道数据是否"糟糕".因此,我需要从人群中随机抽取然后进行测试.如果数据"好",那么保留它.如果数据"不好",则随机抽取另一个并测试它.我想这样做,直到我的样本大小达到25.下面是我尝试编写一个函数的简化示例.谁能告诉我我错过了什么?
df <- data.frame(NAME=c(rep('Frank',10),rep('Mary',10)), SCORE=rnorm(20))
df
random.sample <- function(x) {
x <- df[sample(nrow(df), 1), ]
if (x$SCORE > 0) return(x)
#if (x$SCORE <= 0) run the function again
}
random.sample(df)
Run Code Online (Sandbox Code Playgroud) 我有面板数据(科目/年),我希望只保留每年出现最多次数的科目.数据集很大所以我使用的是data.table包.有没有比我在下面尝试过的更优雅的解决方案?
library(data.table)
DT <- data.table(SUBJECT=c(rep('John',3), rep('Paul',2),
rep('George',3), rep('Ringo',2),
rep('John',2), rep('Paul',4),
rep('George',2), rep('Ringo',4)),
YEAR=c(rep(2011,10), rep(2012,12)),
HEIGHT=rnorm(22),
WEIGHT=rnorm(22))
DT
DT[, COUNT := .N, by='SUBJECT,YEAR']
DT[, MAXCOUNT := max(COUNT), by='YEAR']
DT <- DT[COUNT==MAXCOUNT]
DT <- DT[, c('COUNT','MAXCOUNT') := NULL]
DT
Run Code Online (Sandbox Code Playgroud) 使用R base,我想将一个变量添加到嵌套列表中,其中变量为每个嵌套列表元素更改.以下是一个例子.谢谢.
#CREATE EXAMPLE DATAFRAME
DF <- expand.grid(NAME = c("FRANK", "TONY", "ED"), DATE = seq(as.Date("2014-01-01"), as.Date("2018-12-31"), by = "day"))
#CREATE NESTED LIST
DF <- lapply(1:3, function(i) lapply(2014:2015, function(t) DF[with(DF, as.Date(paste(t, "01", "01", sep = "-")) <= DATE & DATE <= as.Date(paste(t + i, "12", "31", sep = "-"))), ]))
#PRINT NESTED LIST
lapply(DF, lapply, function(x) rbind(head(x), tail(x)))
#I WOULD LIKE TO SIMPLIFY THIS PART
DF[[1]][[1]] <- within(DF[[1]][[1]], GROUP <- 2014)
DF[[1]][[2]] <- within(DF[[1]][[2]], GROUP <- 2015)
DF[[2]][[1]] <- within(DF[[2]][[1]], GROUP …Run Code Online (Sandbox Code Playgroud) 我想使用data.table包基于多个不等式条件对我的数据进行子集化.data.table手册中的示例显示了如何使用字符变量执行此操作,但不使用数字不等式.我还看到如何使用子集函数执行此操作.但我真的想利用data.table二进制搜索速度.以下是我想要做的一个例子.
library(data.table)
data <- data.table(X=seq(-5,5,1), Y=seq(-5,5,1), Z=seq(-5,5,1))
data
setkey(data, X, Y, Z)
#the data.frame way
data[X > 0 & Y > 0 & Z > 0]
#the data.table way (does not work as I expected)
data[J(>0, >0, >0)]
Run Code Online (Sandbox Code Playgroud) 我有一个列表(在R中),其中元素是不同的数据类型,例如,第一个元素是数字,第二个元素是字符.我想对每个元素应用不同的函数.例如,在下面的代码中,我尝试仅将sum函数应用于第一个元素,将length函数仅应用于第二个元素.有没有办法将不同的函数应用于列表的每个元素(不分解列表)?
data <- list(
A = rnorm(10),
B = letters[1:10]
)
lapply(data, list(sum, length))
mapply(function(x) sum, length, data)
Run Code Online (Sandbox Code Playgroud) 我想使用基本R函数将data.frame转换为data.frames列表并保持第一列常量.例如,我想将DF拆分为三个data.frames列表,每个data.frames包含第一列.也就是说,我想最终得到名为LONG的列表,而不必单独输出每个列表元素.谢谢.
DF <- data.frame(OBS=1:10,HEIGHT=rnorm(10),WEIGHT=rnorm(10),TEMP=rnorm(10))
DF
LONG <- list(HEIGHT = DF[c("OBS", "HEIGHT")],
WEIGHT = DF[c("OBS", "WEIGHT")],
TEMP = DF[c("OBS", "TEMP" )])
LONG
SHORT <- as.list(DF)
SHORT
SPLIT <- split(DF, col(DF))
Run Code Online (Sandbox Code Playgroud) 有人可以解释为什么我使用聚合函数得到不同的答案来按组计算缺失值?此外,是否有更好的方法使用本机R函数按组计算缺失值?
DF <- data.frame(YEAR=c(2000,2000,2000,2001,2001,2001,2001,2002,2002,2002), X=c(1,NA,3,NA,NA,NA,7,8,9,10))
DF
aggregate(X ~ YEAR, data=DF, function(x) { sum(is.na(x)) })
with(DF, aggregate(X, list(YEAR), function(x) { sum(is.na(x)) }))
aggregate(X ~ YEAR, data=DF, function(x) { sum(! is.na(x)) })
with(DF, aggregate(X, list(YEAR), function(x) { sum(! is.na(x)) }))
Run Code Online (Sandbox Code Playgroud) 我想在R ts()对象中找到最小值和最大值的日期.我尝试了which.min和which.max函数,但它们只返回"行号".我想输出实际的日期.谢谢.
data <- ts(round(rnorm(60), 2), frequency = 12, end = c(2016, 12))
data
which.min(data)
which.max(data)
Run Code Online (Sandbox Code Playgroud) 如何使用R找到该月的最后一个工作日(例如,星期三)?在下面的代码中,我计算月份,月份日期,月份周和工作日.2014年1月有5个星期三,但2014年2月只有4个星期三,因此我不能使用max(月中的某个星期)作为过滤器.尽管我更喜欢使用基本R函数,但是我们对此感到满意.
DF <- data.frame(DATE = seq(as.Date("2014-01-01"), as.Date("2014-12-31"), "day"))
DF$MONTH <- as.numeric(format(DF$DATE, "%m"))
DF$DAY_OF_MONTH <- as.numeric(format(DF$DATE, "%d"))
DF$WEEK_OF_MONTH <- ceiling(as.numeric(format(DF$DATE, "%d")) / 7)
DF$WEEKDAY <- format(DF$DATE, "%A")
DF
Run Code Online (Sandbox Code Playgroud) r ×10
data.table ×3
count ×2
function ×2
list ×2
aggregate ×1
dataframe ×1
date ×1
inequality ×1
lapply ×1
na ×1
nested ×1
repeat ×1
subset ×1
time-series ×1