我想对数据框列应用diff,并按其名称进行访问。我的工作如下:
abscissa <- "distance"
data.op[, abscissa]
我得到这个输出
# A tibble: 15 x 1
distance
<dbl>
1 0.0426
2 0.0409
3 0.0412
4 0.0406
5 0.0406
6 0.0407
7 0.0402
8 0.0403
9 0.103
10 0.0402
11 0.0395
12 0.0407
13 0.0406
14 0.0405
15 0.0404
然后我简单地尝试:
diff(data.op[, abscissa])
但是输出是:
# A tibble: 15 x 0
我还尝试了data.op[, abscissa] %>% diff
和data.op %>% select(abscissa) %>% diff
的零列结果。
但是,如果我愿意
diff(as.data.frame(data.op)[, abscissa])
有效:
[1] -0.00169560 0.00024120 -0.00061200 0.00000000 0.00013320 -0.00045360 0.00003240 0.06299047 -0.06306967 -0.00071640 0.00120960 -0.00007920
[13] -0.00010440 -0.00005400
当我输入str(data.op)
时,我得到:
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 15 obs. of 28 variables:
...
我不明白的是:
编辑:不正确,我确实使用了mapvalues()
函数来创建数据框,所以我想这就是为什么它是小标题,而不是简单的数据框。
我的data.op也是 一个数据帧,所以diff(data.op[, abscissa])
为什么不起作用?
为什么data.op[, abscissa] %>% diff
和data.op %>% select(abscissa) %>% diff
也不起作用?
我真的需要将其转换为数据框以进行简单的比较吗?这不利于可读性...
对不起,我无法提供更可重复的示例。我尝试了mtcars,并且一切正常(但是mtcars是一个数据帧,而不是一个小问题)。在某个时候,我的data.op数据帧被转换为小标题,但我不知道为什么。
答案 0 :(得分:4)
使用float *calcNewArray(float *oldArray, int oldsize) {
float *newArray;
int new_size = oldsize - outliers;
newArray = malloc((new_size) * sizeof(float));
for (i = 0; i < new_size; i++) {
newArray[i] = oldArray[i];
}
return newArray;
}
mtcars
现在,当您完成
library(tidyverse)
df <- as.tibble(mtcars)
abscissa <- "mpg"
但是
diff(df[, abscissa])
# A tibble: 32 x 0
工作正常。
那是因为
diff(mtcars[, abscissa])
#[1] 0.0 1.8 -1.4 -2.7 -0.6 -3.8 10.1 -1.6 -3.6 -1.4 -1.4 0.9
#[13] -2.1 -4.8 0.0 4.3 17.7 -2.0 3.5 -12.4 -6.0 -0.3 -1.9 5.9
#[25] 8.1 -1.3 4.4 -14.6 3.9 -4.7 6.4
而
class(df[, abscissa])
#[1] "tbl_df" "tbl" "data.frame"
现在来自class(mtcars[, abscissa])
#[1] "numeric"
x-包含要求差值的数字矢量或矩阵
因此,它不适用于小标题。
您可以
?diff
自
df %>% pull(abscissa) %>% diff
# [1] 0.0 1.8 -1.4 -2.7 -0.6 -3.8 10.1 -1.6 -3.6 -1.4 -1.4 0.9
#[13] -2.1 -4.8 0.0 4.3 17.7 -2.0 3.5 -12.4 -6.0 -0.3 -1.9 5.9
#[25] 8.1 -1.3 4.4 -14.6 3.9 -4.7 6.4