小编Aru*_*run的帖子

R中的聚合和加权均值

我试图按资产类别计算资产加权回报.对于我的生活,我无法弄清楚如何使用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)

aggregate r

12
推荐指数
3
解决办法
2万
查看次数

R在data.table(或ddply)中动态构建"list"

我的聚合需求因列/ 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 aggregation plyr data.table

12
推荐指数
4
解决办法
1876
查看次数

如何在data.table中实现J()函数?

我最近了解了优雅的R包data.table.我很想知道该J函数是如何在那里实现的.此函数绑定到函数[.data.table,它在全局环境中不存在.

我下载了源代码但是J在那里找不到这个函数的定义.我发现了lockBind(".SD", ...),但没有J.知道这个功能是如何实现的吗?

非常感谢.

r data.table

12
推荐指数
1
解决办法
2613
查看次数

为什么在data.frame中预先指定类型会变慢?

我正在预先分配一个大数据框,以便稍后填写,我通常会这样做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)

performance r dataframe

11
推荐指数
2
解决办法
383
查看次数

添加拟合二次曲线

我正在尝试将拟合的二次曲线添加到绘图中.

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)

r lm

11
推荐指数
1
解决办法
4万
查看次数

按键列合并两个data.frames

我有两个数据帧.在第一个中,我有一个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)

他们都没有完成任务.

任何提示都会被暗示.谢谢!

r subset dataframe

11
推荐指数
1
解决办法
2万
查看次数

r中的条件连接

我想有条件地将两个数据表连接在一起:

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)

根据以下规则:匹配的最小值outkey.tablekeyz值大于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答案的问题,但答案不必使用该包.

join r dplyr

11
推荐指数
2
解决办法
1689
查看次数

使用'mutate_'按行排列一堆列

在这篇博文中,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)

我想在这些方面改进这个答案:

  1. 其他栏目已经消失.我想保留它们.

  2. 它使用rowSums()必须将 …

r dplyr

11
推荐指数
1
解决办法
791
查看次数

汇总的意外输出

这里尝试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)

aggregate r

10
推荐指数
1
解决办法
292
查看次数

根据规则集删除重复的观察

我试图根据我的变量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 duplicate-removal

10
推荐指数
2
解决办法
7343
查看次数