使用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(.)))