在Python中我可以这样做:
a = np.arange(100)
print id(a) # shows some number
a[:] = np.cumsum(a)
print(id(a)) # shows the same number
Run Code Online (Sandbox Code Playgroud)
我在这里做的更换内容的a,其cumsum.之前和之后的地址是相同的.
现在让我们在R中尝试一下:
install.packages('pryr')
library(pryr)
a = 0:99
print(address(a)) # shows some number
a[1:length(a)] = cumsum(a)
print(address(a)) # shows a different number!
Run Code Online (Sandbox Code Playgroud)
问题是如何用计算结果覆盖R中已经分配的内存?当我在R与Rcpp中进行向量运算时(在C++中编写代码并从R调用它,这可以避免不必要的分配),缺少这种东西似乎会导致显着的性能差异.
我在Ubuntu Linux 10.04上使用R 3.1.1,具有24个物理内核和128 GB RAM.
我需要在B列中重复的值,直到A列发生变化.
这是输入
Column A Column B
18 1
18 0
18 0
18 0
24 2
24 0
18 3
18 0
18 0
18 0
Run Code Online (Sandbox Code Playgroud)
预期产出
Column A Column B
18 1
18 1
18 1
18 1
24 2
24 2
18 3
18 3
18 3
18 3
Run Code Online (Sandbox Code Playgroud) 修改数据:
structure(list(hour = c(0L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 0L, 0L,
1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 0L), cs = c(0L, 0L, 0L, 0L,
0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L,
1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L
), cs_acum = …Run Code Online (Sandbox Code Playgroud) 上下文:我想将累积和列添加到名为words_uni的tibble中.我使用了库(dplyr),函数mutate.我使用R版本3.4.1 64位 - Windows 10和RStudio版本1.0.143
> head(words_uni)
# A tibble: 6 x 3
# Groups: Type [6]
Type Freq per
<chr> <int> <dbl>
1 the 937839 0.010725848
2 i 918552 0.010505267
3 to 788892 0.009022376
4 a 615082 0.007034551
Run Code Online (Sandbox Code Playgroud)
然后我做了以下事情:
> words_uni1 = words_uni %>%
mutate( acum= cumsum(per))
> head(words_uni1)
# A tibble: 6 x 4
# Groups: Type [6]
Type Freq per acum
<chr> <int> <dbl> <dbl>
1 the 937839 0.010725848 0.010725848
2 i 918552 0.010505267 0.010505267
3 …Run Code Online (Sandbox Code Playgroud) 我是熊猫的新手,我可以添加到 cumsum 作为
df.cumsum(axis=1)
y0 y1 y2
0 2 3 4
1 2 2 3
2 0 0 0
3 1 2 3
y0 y1 y2
0 2 5 9
1 2 4 7
2 0 0 0
3 1 3 6
Run Code Online (Sandbox Code Playgroud)
但是有没有办法只在前 2 列上执行,即跳过 y2?
下面你可以看到我有一个更大的桌子的例子
library(data.table)
input <- data.table(ID = c("A", "B"),
Para = c(2.8, 5),
Value1 = c(50, 80),
Value2 = c(80, 40),
Value3 = c(80, 100),
Value4 = c(60, 10),
Value5 = c(40, 80))
Run Code Online (Sandbox Code Playgroud)
我想要实现的是添加一个列,其中包含Para列中指定的下一个x列的累积和.但如果逗号后面有数字,则应按数字调整列中的值.
所以对于第一行(Para = 2.8),结果应该是
1*50 + 1*80 + 0.8*80 = 194
Run Code Online (Sandbox Code Playgroud)
第二行(Para = 5)的结果应该是
1*80 + 1*40 + 1*100 + 1*10 + 1*80 = 310
Run Code Online (Sandbox Code Playgroud)
决赛桌应该是这样的
output <- cbind(input, Result = c(194, 310))
Run Code Online (Sandbox Code Playgroud)
我想到的是将Para值2.8分成5个数字的百分比向量,所以整个范围.
c(1, 1, .8, 0, 0)
Run Code Online (Sandbox Code Playgroud)
将Value1:Value5列与此向量相乘,然后将所有Value1:Value5相加.但是我不知道如何将2.8分成这样一个向量,也许还有一个我不了解的更好的解决方案.谢谢.
我想从最后一个值计算数字向量的累积总和并向后移动。cumsum()R 中的标准函数通常从第一个值开始并向前移动,就像简单的例子一样 -
cumsum(1:5)
## 1 3 6 10 15
Run Code Online (Sandbox Code Playgroud)
但我想要这样的结果 -
15, 14, 12, 9, 5
Run Code Online (Sandbox Code Playgroud)
是否有任何 R 函数可以直接计算?
我想计算每组5天内的累计总和。
df <- data.frame(
date = ymd( c( "2022-01-02","2022-01-03","2022-01-05","2022-01-07","2022-01-11","2022-01-14","2022-01-17","2022-01-18","2022-01-24","2022-01-27","2022-01-01","2022-01-04","2022-01-04","2022-01-08","2022-01-12","2022-01-14","2022-01-19","2022-01-24","2022-01-25","2022-01-28")),
group = c("A","A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B","B"),
number = c(10,30,20,50,30,50,40,50,30,50,55,10,30,20,50,30,40,30,40,30))
Run Code Online (Sandbox Code Playgroud)
下面是我的数据框的一个小样本,包括累积总和列应返回的内容。任何帮助,将不胜感激。谢谢。
date group number cumsum(s)
2022-01-02 A 10 10
2022-01-03 A 30 40
2022-01-05 A 20 60
2022-01-07 A 50 110
2022-01-11 A 30 80
2022-01-14 A 50 80
2022-01-17 A 40 90
2022-01-18 A 50 140
2022-01-24 A 30 30
2022-01-27 A 50 80
2022-01-01 B 55 55
2022-01-04 B 10 65
2022-01-04 B 30 95
2022-01-08 B 20 60
2022-01-12 B 50 70 …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个代码,从向量中获取每第 7 个累积和值,但使用循环结构运行速度非常慢,因为我的数据太大了。
这是我写的代码。结果是预期的,但正如我所说,它运行得很慢:
for (i in 1:50000) {
B[i] <- cumsum(A[i:50000])[7]
}
Run Code Online (Sandbox Code Playgroud)
示例:A = 4 1 2 2 6 2 6 6 1 10 5 8 6 9 1
结果必须是:
B[1] = (4+1+2+2+6+2+6) = 23
B[2] = (1+2+2+6+2+6+6) = 25
所以...
谢谢。
是否存在预先存在的函数来计算连续值之间的累积差异?
背景:这是为了估计一个人在CycleStreet.net生成的旅程中必须在两个方向上进行的高度变化.
可重复的例子:
x <- c(27, 24, 24, 27, 28) # create the data
Run Code Online (Sandbox Code Playgroud)
方法1:for循环
for(i in 2:length(x)){ # for loop way
if(i == 2) cum_change <- 0
cum_change <- Mod(x[i] - x[i - 1]) + cum_change
cum_change
}
## 7
Run Code Online (Sandbox Code Playgroud)
方法2:矢量化
diffs <- Mod(x[-1] - x[-length(x)]) # vectorised way
sum(diffs)
## 7
Run Code Online (Sandbox Code Playgroud)
两者似乎都有效.我只是想知道在基本R中是否存在另一种(更普遍的)实现,或者像dplyr或RcppRoll这样的实现.