我试图在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等.
我试图合并两个数据帧:一个有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.
有关如何解决这个问题的任何想法?
我坚持使用以下代码:
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) 我经常遇到需要从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) 我有一个功能
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)
但我宁愿不这样做.
是否有一些简单的解决方案来实现这一目标?
给定2个在列名/数据类型方面相同的数据帧,其中一些列唯一地标识行,是否有一个有效的函数/方法用于一个data.frame来"更新"另一个?
例如,在下文中,original并replacement通过识别'Name'和'Id'. goal为找到的所有行的结果replacement中original(由唯一的ID),并与替换Value1和Value2
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)
该解决方案应为工作 …
我有一个矩阵,我做了一个使用的图像image(matrix).有没有在我的图像中添加颜色的图例,就像我在为图表添加图例时一样?
所以我在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的新手:)
我刚在剧本中发现了这个警告,有点奇怪.
# 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) 假设我们有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倍.
我认为,差异的一种可能性可能是由于 …