使用R从数据帧中提取数据并将数据存储在未知数量的新列中

使用R从数据帧中提取数据并将数据存储在未知数量的新列中,r,dataframe,dplyr,data-extraction,R,Dataframe,Dplyr,Data Extraction,我有一个数据框,如下所示: library(dplyr) df <- data.frame(A=1:20, B=c(2,1.8,1.6,1.8,4,6,8,10,12,10,8,6,13,14,15,16,16.5,15,14,13)) mutate(df, C = B - lag(B)) A B C 1 2.0 NA 2 1.8 -0.2 3 1.6 -0.2 4 1.8 0.2 5 4.0 2.2 6 6

我有一个数据框,如下所示:

library(dplyr)
df <- data.frame(A=1:20, 
                  B=c(2,1.8,1.6,1.8,4,6,8,10,12,10,8,6,13,14,15,16,16.5,15,14,13))
mutate(df, C = B - lag(B))
A   B     C
1   2.0   NA
2   1.8 -0.2
3   1.6 -0.2
4   1.8  0.2
5   4.0  2.2
6   6.0  2.0
7   8.0  2.0
8   10.0  2.0
9   12.0  2.0
10  10.0 -2.0
11  8.0 -2.0
12  6.0 -2.0
13  13.0  7.0
14  14.0  1.0
15  15.0  1.0
16  16.0  1.0
17  16.5 -0.5
18  15.0 -1.0
19  14.0 -1.0
20  13.0 -1.0
库(dplyr)

df这里有一个带有
rleid
的选项,用于基于列“C”的
符号创建一个运行长度id分组,即那些具有相同
符号的相邻元素将具有相同的分组“id”,并且当
符号
中存在差异时,它将递增。然后,我们根据count(
n()
)值创建列,该值是特定的数字,即3或4

library(dplyr)
library(data.table)
df %>%
   mutate(C = B - lag(B)) %>%
  group_by(grp = rleid(sign(C))) %>%
  mutate(newC3 = if(n() ==3 && all(C < 0)) C else NA,
         newC4 = if(n() == 4 && all(C < 0) C else NA)
-输出

# A tibble: 20 x 6
#       A     B      C     C2    C4    C7
#   <int> <dbl>  <dbl>  <dbl> <dbl> <dbl>
# 1     1   2   NA     NA        NA    NA
# 2     2   1.8 -0.200 -0.200    NA    NA
# 3     3   1.6 -0.200 -0.200    NA    NA
# 4     4   1.8  0.200 NA        NA    NA
# 5     5   4    2.2   NA        NA    NA
# 6     6   6    2     NA        NA    NA
# 7     7   8    2     NA        NA    NA
# 8     8  10    2     NA        NA    NA
# 9     9  12    2     NA        NA    NA
#10    10  10   -2     NA        -2    NA
#11    11   8   -2     NA        -2    NA
#12    12   6   -2     NA        -2    NA
#13    13  13    7     NA        NA    NA
#14    14  14    1     NA        NA    NA
#15    15  15    1     NA        NA    NA
#16    16  16    1     NA        NA    NA
#17    17  16    0     NA        NA    NA
#18    18  15   -1     NA        NA    -1
#19    19  14   -1     NA        NA    -1
#20    20  13   -1     NA        NA    -1

是否仅对C列或每列执行此操作?是,仅对C列执行此操作C@akrun-您是指连续超过3个值吗?如果是这样的话,那将是一个新的dataSorry列,B列应该是16.5,我现在已经在那里更新了。非常感谢。请您解释一下自动版本好吗?非常强大。thanks@user1655130谢谢,我更新了帖子。希望它能给你带来巨大的帮助。再次感谢顺便说一句,假设它是连续的5行-我如何将它改为5行(而不是目前的3行)Thanks@user1655130在第一个选项中,只需使用
if(n()==5&&all(C<0))C else NA
,在第二种情况下,您希望
group_by(grp)%%>%变异(C1=case_when(C<0&n()==5~C))
# A tibble: 20 x 6
#       A     B      C     C2    C4    C7
#   <int> <dbl>  <dbl>  <dbl> <dbl> <dbl>
# 1     1   2   NA     NA        NA    NA
# 2     2   1.8 -0.200 -0.200    NA    NA
# 3     3   1.6 -0.200 -0.200    NA    NA
# 4     4   1.8  0.200 NA        NA    NA
# 5     5   4    2.2   NA        NA    NA
# 6     6   6    2     NA        NA    NA
# 7     7   8    2     NA        NA    NA
# 8     8  10    2     NA        NA    NA
# 9     9  12    2     NA        NA    NA
#10    10  10   -2     NA        -2    NA
#11    11   8   -2     NA        -2    NA
#12    12   6   -2     NA        -2    NA
#13    13  13    7     NA        NA    NA
#14    14  14    1     NA        NA    NA
#15    15  15    1     NA        NA    NA
#16    16  16    1     NA        NA    NA
#17    17  16    0     NA        NA    NA
#18    18  15   -1     NA        NA    -1
#19    19  14   -1     NA        NA    -1
#20    20  13   -1     NA        NA    -1
...
  %>%
   rename_at(vars(matches('^C\\d+')), ~ str_c('C', seq_along(.)))