我试图按资产类别计算资产加权回报.对于我的生活,我无法弄清楚如何使用aggregate命令来做到这一点.
我的数据框看起来像这样
dat <- data.frame(company, fundname, assetclass, return, assets)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做一些事情(不要复制这个,这是错的):
aggregate(dat, list(dat$assetclass), weighted.mean, w=(dat$return, dat$assets))
Run Code Online (Sandbox Code Playgroud) 我的聚合需求因列/ data.frames而异.我想动态地将"list"参数传递给data.table.
作为一个最小的例子:
require(data.table)
type <- c(rep("hello", 3), rep("bye", 3), rep("ok",3))
a <- (rep(1:3, 3))
b <- runif(9)
c <- runif(9)
df <- data.frame(cbind(type, a, b, c), stringsAsFactors=F)
DT <-data.table(df)
Run Code Online (Sandbox Code Playgroud)
这个电话:
DT[, list(suma = sum(as.numeric(a)), meanb = mean(as.numeric(b)), minc = min(as.numeric(c))), by= type]
Run Code Online (Sandbox Code Playgroud)
会有类似的结果:
type suma meanb minc
1: hello 6 0.1332210 0.4265579
2: bye 6 0.5680839 0.2993667
3: ok 6 0.5694532 0.2069026
Run Code Online (Sandbox Code Playgroud)
未来的data.frames将有更多的列,我想要以不同的方式进行总结.但是为了使用这个小例子:有没有办法以编程方式传递列表?
我天真地尝试过:
# create a different list
mylist <- "list(lengtha = length(as.numeric(a)), maxb = max(as.numeric(b)), meanc = …Run Code Online (Sandbox Code Playgroud) 我最近了解了优雅的R包data.table.我很想知道该J函数是如何在那里实现的.此函数绑定到函数[.data.table,它在全局环境中不存在.
我下载了源代码但是J在那里找不到这个函数的定义.我发现了lockBind(".SD", ...),但没有J.知道这个功能是如何实现的吗?
非常感谢.
我正在预先分配一个大数据框,以便稍后填写,我通常会这样做NA:
n <- 1e6
a <- data.frame(c1 = 1:n, c2 = NA, c3 = NA)
Run Code Online (Sandbox Code Playgroud)
如果我事先指定数据类型,我想知道它是否会让事情变得更快,所以我测试了
f1 <- function() {
a <- data.frame(c1 = 1:n, c2 = NA, c3 = NA)
a$c2 <- 1:n
a$c3 <- sample(LETTERS, size= n, replace = TRUE)
}
f2 <- function() {
b <- data.frame(c1 = 1:n, c2 = numeric(n), c3 = character(n))
b$c2 <- 1:n
b$c3 <- sample(LETTERS, size= n, replace = TRUE)
}
> system.time(f1())
user system elapsed
0.219 0.042 0.260 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将拟合的二次曲线添加到绘图中.
abline(lm(data~factor+I(factor^2)))
Run Code Online (Sandbox Code Playgroud)
显示的回归是线性的而不是二次的,我得到这样的信息:
Message d'avis:在abline(lm(data~factor + I(factor ^ 2)),col = palette [iteration]):利用des deux premiers des 3 systemsderégression
意思是:
使用3个回归系数中的前2个
当只运行该lm()功能时,我没有收到任何消息.
这是一个示例数据:
factor <- 1:7
data <- c(0.1375000,0.2500000,0.3416667,0.4583333,0.7250000,0.9166667,1.0000000)
Run Code Online (Sandbox Code Playgroud) 我有两个数据帧.在第一个中,我有一个KEY/ID列和两个变量:
KEY V1 V2
1 10 2
2 20 4
3 30 6
4 40 8
5 50 10
Run Code Online (Sandbox Code Playgroud)
在第二个数据框中,我有一个KEY/ID列和第三个变量
KEY V3
1 5
2 10
3 20
Run Code Online (Sandbox Code Playgroud)
我想根据KEY列提取第一个数据帧的行,这些行也在第二个数据帧中.我还想将V3列添加到最终数据集中.
KEY V1 V2 V3
1 10 2 5
2 20 4 10
3 30 6 20
Run Code Online (Sandbox Code Playgroud)
这是我使用子集和合并函数的尝试
subset(data1, data1$KEY == data2$KEY)
merge(data1, data2, by.x = "KEY", by.y = "KEY")
Run Code Online (Sandbox Code Playgroud)
他们都没有完成任务.
任何提示都会被暗示.谢谢!
我想有条件地将两个数据表连接在一起:
library(data.table)
set.seed(1)
key.table <-
data.table(
out = (0:10)/10,
keyz = sort(runif(11))
)
large.tbl <-
data.table(
ab = rnorm(1e6),
cd = runif(1e6)
)
Run Code Online (Sandbox Code Playgroud)
根据以下规则:匹配的最小值out在key.table其keyz值大于cd.我有以下内容:
library(dplyr)
large.tbl %>%
rowwise %>%
mutate(out = min(key.table$out[key.table$keyz > cd]))
Run Code Online (Sandbox Code Playgroud)
它提供了正确的输出.我遇到的问题是,我实际使用的rowwise操作似乎很昂贵,large.tbl除非它在特定的计算机上,否则会崩溃.是否有更少的内存昂贵的操作?以下似乎稍微快一点,但对我遇到的问题还不够.
large.tbl %>%
group_by(cd) %>%
mutate(out = min(key.table$out[key.table$keyz > cd]))
Run Code Online (Sandbox Code Playgroud)
这有点像data.table答案的问题,但答案不必使用该包.
在这篇博文中,Paul Hiemstra展示了如何总结两列dplyr::mutate_.复制/粘贴相关部件:
library(lazyeval)
f = function(col1, col2, new_col_name) {
mutate_call = lazyeval::interp(~ a + b, a = as.name(col1), b = as.name(col2))
mtcars %>% mutate_(.dots = setNames(list(mutate_call), new_col_name))
}
Run Code Online (Sandbox Code Playgroud)
允许一个人做:
head(f('wt', 'mpg', 'hahaaa'))
Run Code Online (Sandbox Code Playgroud)
大!
我跟着一个问题(见评论)关于如何将它扩展到100列,因为我不太清楚(对我而言)如何使用上述方法键入所有名称.保罗非常友好地放纵我并提供了这个答案(谢谢!):
# data
df = data.frame(matrix(1:100, 10, 10))
names(df) = LETTERS[1:10]
# answer
sum_all_rows = function(list_of_cols) {
summarise_calls = sapply(list_of_cols, function(col) {
lazyeval::interp(~col_name, col_name = as.name(col))
})
df %>% select_(.dots = summarise_calls) %>% mutate(ans1 = rowSums(.))
}
sum_all_rows(LETTERS[sample(1:10, 5)])
Run Code Online (Sandbox Code Playgroud)
我想在这些方面改进这个答案:
其他栏目已经消失.我想保留它们.
它使用rowSums()必须将 …
在这里尝试aggregate另一个问题时,我遇到了一个相当奇怪的结果.我无法弄清楚为什么,我想知道我在做什么是完全错误的.
假设,我有data.frame这样的:
df <- structure(list(V1 = c(1L, 2L, 1L, 2L, 3L, 1L),
V2 = c(2L, 3L, 2L, 3L, 4L, 2L),
V3 = c(3L, 4L, 3L, 4L, 5L, 3L),
V4 = c(4L, 5L, 4L, 5L, 6L, 4L)),
.Names = c("V1", "V2", "V3", "V4"),
row.names = c(NA, -6L), class = "data.frame")
> df
# V1 V2 V3 V4
# 1 1 2 3 4
# 2 2 3 4 5
# 3 1 2 3 4 …Run Code Online (Sandbox Code Playgroud) 我试图根据我的变量id从数据集中删除重复的观察结果.但是,我希望删除观察结果基于以下规则.下面的变量是id,户主的性别(男性,男性,女性)和户主的年龄.规则如下.如果一个家庭有男性和女性家庭户主,则取消女性户主观察.如果一个家庭为两个男性或两个女性头部,请用年轻的家庭头部取消观察.下面是一个示例数据集.
id = c(1,2,2,3,4,5,5,6,7,8,8,9,10)
sex = c(1,1,2,1,2,2,2,1,1,1,1,2,1)
age = c(32,34,54,23,32,56,67,45,51,43,35,80,45)
data = data.frame(cbind(id,sex,age))
Run Code Online (Sandbox Code Playgroud) r ×10
aggregate ×2
data.table ×2
dataframe ×2
dplyr ×2
aggregation ×1
join ×1
lm ×1
performance ×1
plyr ×1
subset ×1