我有一些数据,比如Area_bsl
,它包含逗号分隔的值的字符串,还有一列diffr
,它声明了Area_bsl
必须 * 缩短 * 的元素数量:
df <- data.frame(
id = 1:3,
Area_bsl = c("155,199,198,195,100,112,177,199,188,144",
"100,99,98,95,100,112,111,99",
"131,166,155,111,100,117,166,188,101,101,105,166"),
diffr = c(3,0,6)
)
所以我要做的就是切断...
Area_bsl
和id == 1
中的最后3个元素Area_bsl
和id == 2
中的0个元素Area_bsl
和id == 3
中的最后6个元素
我一直是这样完成这个任务的使用slice_head
的最后一部分抛出错误:
library(tidyverse)
df %>%
# separate comma-separated values into rows:
separate_rows(Area_bsl) %>%
# for each `id`...:
group_by(id) %>%
#... create a row counter:
mutate(rowid = row_number()) %>%
# ...create the cutoff point:
mutate(cutoff = last(rowid) - diffr) %>%
# ...slice out as many as `cutoff` rows: <--- does not work!
slice_head(n = cutoff[1])
Error in `slice_head()`:
! `n` must be a constant.
Caused by error in `force()`:
! object 'cutoff' not found
预期结果如下:
id Area_bsl diffr rowid cutoff
<int> <chr> <dbl> <int> <dbl>
1 1 155 3 1 7
2 1 199 3 2 7
3 1 198 3 3 7
4 1 195 3 4 7
5 1 100 3 5 7
6 1 112 3 6 7
7 1 177 3 7 7
11 2 100 0 1 8
12 2 99 0 2 8
13 2 98 0 3 8
14 2 95 0 4 8
15 2 100 0 5 8
16 2 112 0 6 8
17 2 111 0 7 8
18 2 99 0 8 8
19 3 131 6 1 6
20 3 166 6 2 6
21 3 155 6 3 6
22 3 111 6 4 6
23 3 100 6 5 6
24 3 117 6 6 6
7条答案
按热度按时间0lvr5msh1#
您可以在
mapply
中使用sub
来缩短给定数量的元素,然后使用tidyr::separate_rows
。1l5u6lss2#
还有另一个选择:
vd2z7a6w3#
您可以使用
strsplit
并将Area_bsl
作为列表列进行管理。然后是unnest
。使用row_number()
时,rowid和cutoff应该很简单创建于2023-05-05带有reprex v2.0.2
2cmtqfgy4#
使用
strsplit
+head
:输出
pbgvytdp5#
**更新:**如果我们想省略
rowwise
操作:我们可以分组:
第一个答案:
首先,我们从字符串
Area_bsl
中删除n =diffr
,其中strsplit()
,然后再次删除collapse
。最后我们使用separate_rows
:或
yqhsw0fo6#
我们可以扩展
Area_bsl
列,然后扩展范围内的filter
rowid。2w3kk1z57#
下面是另一个选项,其中
sub
+scan
用于解析Area_bsl
列中所需的数字子集它给出了