小编Aru*_*run的帖子

用于通过索引对矢量进行分区并对该分区执行操作的惯用R代码

我试图在R中找到惯用的方法来通过某个索引向量对数值向量进行分区,找到该分区中所有数字的总和,然后将每个单独的条目除以该分区总和.换句话说,如果我从这开始:

df <- data.frame(x = c(1,2,3,4,5,6), index = c('a', 'a', 'b', 'b', 'c', 'c'))
Run Code Online (Sandbox Code Playgroud)

我希望输出创建一个向量(让我们称之为z):

c(1/(1+2), 2/(1+2), 3/(3+4), 3/(3+4), 5/(5+6), 6/(5+6))  
Run Code Online (Sandbox Code Playgroud)

如果我这样做是SQL并且可以使用窗口函数,我会这样做:

select 
 x / sum(x) over (partition by index) as z 
from df
Run Code Online (Sandbox Code Playgroud)

如果我使用plyr,我会做这样的事情:

ddply(df, .(index), transform, z = x / sum(x))
Run Code Online (Sandbox Code Playgroud)

但我想知道如何使用标准的R函数编程工具,如mapply/aggregate等.

functional-programming r plyr

18
推荐指数
3
解决办法
2432
查看次数

超出R的内存限制(即使使用24GB RAM)

我试图合并两个数据帧:一个有33个变量的908450个观测值,另一个有2个变量的908450个观测值.

dataframe2 <-merge(dataframe1, dataframe2, by="id")
Run Code Online (Sandbox Code Playgroud)

我已经清除了工作内存中的所有其他数据帧,并使用以下代码重置了我的内存限制(对于具有24 GB RAM的全新桌面):

memory.limit(24576)
Run Code Online (Sandbox Code Playgroud)

但是,我仍然得到错误Cannot allocate vector of size 173.Mb.

有关如何解决这个问题的任何想法?

memory memory-management r dataframe

18
推荐指数
1
解决办法
4110
查看次数

代码中的不符合数组错误

我坚持使用以下代码:

y = c(2.5, 6.0, 6.0, 7.5, 8.0, 8.0, 16.0, 6.0, 5.0, 6.0, 28.0, 5.0, 9.5, 
      6.0, 4.5, 10.0, 14.0, 3.0, 4.5, 5.5, 3.0, 3.5, 6.0, 2.0, 3.0, 4.0, 
      6.0, 5.0, 6.5, 5.0, 10.0, 6.0, 18.0, 4.5, 20.0) 

x2 = c(650, 2500, 900, 800, 3070, 2866, 7500, 800, 800, 650, 2100, 2000, 
       2200, 500, 1500, 3000, 2200, 350, 1000, 600, 300, 1500, 2200, 900, 
       600, 2000, 800, 950, 1750, 500, 4400, 600, 5200, 850, 5000) 

x1 = c(16.083, 48.350, 33.650, …
Run Code Online (Sandbox Code Playgroud)

r

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

创建一个函数,用一个data.frame替换来自另一个data.frame的值

我经常遇到需要从data.frame中替换缺失值的情况,其中一些其他data.frame的值处于不同的聚合级别.因此,例如,如果我有一个充满县数据的data.frame,我可能会将NA值替换为存储在另一个data.frame中的状态值.写完相同的merge... ifelse(is.na())yada yada几十次后我决定分解并写一个函数来做到这一点.

这是我做的东西,以及我如何使用它的一个例子:

fillNaDf <- function(naDf, fillDf, mergeCols, fillCols){
 mergedDf <- merge(naDf, fillDf, by=mergeCols)
 for (col in fillCols){
   colWithNas <- mergedDf[[paste(col, "x", sep=".")]]
   colWithOutNas <- mergedDf[[paste(col, "y", sep=".")]]
   k <- which( is.na( colWithNas ) )
   colWithNas[k] <- colWithOutNas[k]
   mergedDf[col] <- colWithNas
   mergedDf[[paste(col, "x", sep=".")]] <- NULL
   mergedDf[[paste(col, "y", sep=".")]] <- NULL
 }
 return(mergedDf)
}

## test case
fillDf <- data.frame(a = c(1,2,1,2), b = c(3,3,4,4) ,f = c(100,200, 300, 400), g = c(11, 12, 13, 14)) …
Run Code Online (Sandbox Code Playgroud)

r na

17
推荐指数
2
解决办法
3070
查看次数

避免参数重复通过(...)

我有一个功能

somefun <- function(someparameters , ...) { plot(stuff, ...)}
Run Code Online (Sandbox Code Playgroud)

现在我想在用户没有指定这些参数的情况下为绘图提供一些默认值.(即xlab="").

如何提供一组默认的绘图选项,但仍允许用户覆盖这些参数?因为如果两次输入相同的参数,R将抛出错误:由多个实际参数匹配的形式参数.

我知道我可以通过我的功能传递所有这些选项

somefun <- function(someparameters, main, xlab, ylab, xlim....)
Run Code Online (Sandbox Code Playgroud)

但我宁愿不这样做.

是否有一些简单的解决方案来实现这一目标?

r

15
推荐指数
1
解决办法
1427
查看次数

使用一个data.frame更新另一个

给定2个在列名/数据类型方面相同的数据帧,其中一些列唯一地标识行,是否有一个有效的函数/方法用于一个data.frame来"更新"另一个?

例如,在下文中,originalreplacement通过识别'Name''Id'. goal为找到的所有行的结果replacementoriginal(由唯一的ID),并与替换Value1Value2

original = data.frame( Name = c("joe","john") , Id = c( 1 , 2) , Value1 = c(1.2,NA), Value2 = c(NA,9.2) )
replacement = data.frame( Name = c("john") , Id = 2 , Value1 = 2.2 , value2 = 5.9)
goal = data.frame( Name = c("joe","john") , Id = c( 1 , 2) , Value1 = c(1.2,2.2), Value2 = c(NA,5.9) )
Run Code Online (Sandbox Code Playgroud)

该解决方案应为工作 …

indexing r dataframe

14
推荐指数
3
解决办法
3466
查看次数

为图像添加颜色图例

我有一个矩阵,我做了一个使用的图像image(matrix).有没有在我的图像中添加颜色的图例,就像我在为图表添加图例时一样?

r image legend

14
推荐指数
3
解决办法
1万
查看次数

删除除最后一个实例之外的所有重复项

所以我在R中有一个数据集,其中以下布局为例:

ID Date Tally
1 2/1/2011 1
2 2/1/2011 2
3 2/1/2011 3
1 2/1/2011 4
2 2/1/2011 5
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9
Run Code Online (Sandbox Code Playgroud)

我想删除除post id的LAST实例之外的所有实例.现在我可以在网上找到的所有东西,我正在使用的功能是删除除FIRST实例之外的所有内容.

所以我的新数据框架看起来像:

ID Date Tally
1 2/1/2011 6
3 2/1/2011 7
4 2/1/2011 8
2 2/1/2011 9
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?现在我只能保留第一个实例.我希望它做相反的事情吗?有帮助吗?

忍受我,我是R的新手:)

r duplicate-removal

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

rbindlist两个data.tables,其中一个有因子,另一个有列的字符类型

我刚在剧本中发现了这个警告,有点奇怪.

# Warning message:
# In rbindlist(list(DT.1, DT.2)) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)

观察1:这是一个可重复的例子:

require(data.table)
DT.1 <- data.table(x = letters[1:5], y = 6:10)
DT.2 <- data.table(x = LETTERS[1:5], y = 11:15)

# works fine
rbindlist(list(DT.1, DT.2))
#     x  y
#  1: a  6
#  2: b  7
#  3: c  8
#  4: d  9
#  5: e 10
#  6: A 11
#  7: B 12
#  8: C 13
#  9: D 14
# 10: E 15 …
Run Code Online (Sandbox Code Playgroud)

r data.table

13
推荐指数
1
解决办法
4135
查看次数

为什么"逻辑"类型的子集比"数字"类型的子集慢?

假设我们有vector(或者data.frame就此而言)如下:

set.seed(1)
x <- sample(10, 1e6, TRUE)
Run Code Online (Sandbox Code Playgroud)

而一个人想获得的所有值都x在那里x > 4,说:

a1 <- x[x > 4] # (or) 
a2 <- x[which(x > 4)]

identical(a1, a2) # TRUE
Run Code Online (Sandbox Code Playgroud)

我想大多数人都会喜欢x[x > 4].但令人惊讶的是(至少对我来说),使用子集which更快!

require(microbenchmark)
microbenchmark(x[x > 4], x[which(x > 4)], times = 100)

Unit: milliseconds
            expr      min       lq   median       uq       max neval
        x[x > 4] 56.59467 57.70877 58.54111 59.94623 104.51472   100
 x[which(x > 4)] 26.62217 27.64490 28.31413 29.97908  99.68973   100
Run Code Online (Sandbox Code Playgroud)

它比我快2.1倍.

我认为,差异的一种可能性可能是由于 …

r subset

13
推荐指数
1
解决办法
809
查看次数