gpt4 book ai didi

3 位字符序列的重复行值 - 整齐的数据

转载 作者:行者123 更新时间:2023-12-05 08:20:51 25 4
gpt4 key购买 nike

给定以下数据框:

df <- data.frame(start = c("005", "010", "014"),
end = c("005", "013", "017"),
zone = c(3, 5, 7))
# df
# start end zone
# 1 005 005 3
# 2 010 013 5
# 3 014 017 7

我想生成以下结果:

#   key zone
# 1 005 3
# 2 010 5
# 3 011 5
# 4 012 5
# 5 013 5
# 6 014 7
# 7 015 7
# 8 016 7
# 9 017 7

我在想我也许可以利用 tidyr 中的一些东西——也许是 complete()expand(),但有三个- df$startdf$end 的字符串一直给我带来麻烦。

我已经取得了一定的成功:apply(df, 1, function(i) seq(as.numeric(i["start"]), as.numeric(i["end"]))) 然后我可以将其传递给类似 stringr::str_pad(..., width = 3, pad = "0") 的内容,但我不确定如何获取这些区域对这些重复的序列很巧妙。

最佳答案

使用data.table,您可以通过链接在一起的三个步骤来完成此操作。首先,使用 setDT 将数据帧转换为数据表。其次,将 startend 列转换为数字。第三,通过使用 start 列中的值作为起始值和 end 中的值,为原始数据框中的每一行创建序列来创建 key 列作为最终值。第四,使用 sprintfkey 列转换回字符,并在短于 3 位的数字前添加零:

library(data.table)
cols <- names(df)[1:2]
setDT(df)[, (cols) := lapply(.SD, function(x) as.numeric(as.character(x))), .SDcols = cols
][, .(key = start:end), by = zone
][, key := sprintf('%03d',key)][]

给出:

   zone key
1: 3 005
2: 5 010
3: 5 011
4: 5 012
5: 5 013
6: 7 014
7: 7 015
8: 7 016
9: 7 017

根据您的 startend 列是否是因子的特征,您应该使用 as.numeric(x)as.numeric(as.character(x)).

按照@alistaire 的评论,您可以好奇地省略 as.numeric 部分。因此:

setDT(df)[, (cols) := lapply(.SD, function(x) as.character(x)), .SDcols = cols
][, .(key = start:end), by = zone
][, key := sprintf('%03d',key)][]

会给你相同的结果(当你的 startend 列已经是字符类时,你当然可以省略 lapply 步骤) .

关于3 位字符序列的重复行值 - 整齐的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37840789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com