gpt4 book ai didi

r - 在多行上按 '/' 一次拆分数千列,对新行中的值进行排序并添加 'NA' 值

转载 作者:行者123 更新时间:2023-12-02 06:35:14 25 4
gpt4 key购买 nike

我想拆分一个包含数千列的数据框。数据框如下所示:

# sample data of four columns
sample <-read.table(stdin(),header=TRUE,sep="")
POS v1 v2 v3 v4
152 0 0/1 0/2 0/1/2
73 1 0 0/1 0/1
185 0 1 0/3 0

输出应该是:

POS v1  v2  v3  v4
152 0 0 0 0
152 NA 1 NA 1
152 NA NA 2 2
73 NA 0 0 0
73 1 NA 1 1
185 0 NA 0 0
185 NA 1 NA NA
185 NA NA NA NA
185 NA NA 3 NA

值0、1、2和3应该在这样得到的新行上排序,而字段POS中的值应该重复。然后插入NA值以获得相同长度的列。

最佳答案

这是一个使用 data.table 的解决方案:

library("data.table")
dt <- data.table(df)
fun <- function(DT) {
split <- strsplit(vapply(DT, as.character, character(1L)), "/")
lapply(split,
function(x, max.len) as.numeric(x)[match(0:max.len, as.numeric(x))],
max.len=max(as.numeric(unlist(split)))
) }
dt[, fun(.SD), by=POS]
# POS v1 v2 v3 v4
# 1: 152 0 0 0 0
# 2: 152 NA 1 NA 1
# 3: 152 NA NA 2 2
# 4: 73 NA 0 0 0
# 5: 73 1 NA 1 1
# 6: 185 0 NA 0 0
# 7: 185 NA 1 NA NA
# 8: 185 NA NA NA NA
# 9: 185 NA NA 3 NA

想法是使用data.table 对每一行的数据元素执行我们的函数fun(即排除POS)。 data.table 会为我们修改后的结果拼接POS

这里 fun 首先将每个数据行转换为一个字符向量,然后按 / 拆分,这将为每个项目生成一个列表,一个字符向量包含与 / 一样多的元素,+ 1.

最后,lapply 循环遍历每个列表项,将它们全部转换为相同长度的向量,填充为 NA,然后排序。

data.table 将结果列表识别为表示我们结果集的列,并如前所述添加回 POS 列。


编辑:以下内容解决了评论中的一个问题:

val <- "0/2/3:25:0.008,0.85,0.002:0.004,0.013,0.345"
first.colon <- strsplit(val, ":")[[1]][[1]]
strsplit(first.colon, "/")[[1]]
// [1] "0" "2" "3"

要理解的关键是 strsplit 返回一个列表,其中的元素数量与输入向量中的项目数量一样多。在这个玩具示例中,向量中只有一个项目,因此列表中只有一个项目,尽管每个项目都是一个可以具有多个值的字符向量(在本例中,我们按 /< 拆分后为 3/)。所以像这样的东西应该可以工作(但我还没有测试调试):

dt <- data.table(df)
fun <- function(DT) {
split <- strsplit(vapply(DT, as.character, character(1L)), ":")
split.2 <- vapply(split, `[[`, character(1L), 1) # get just first value from `:` split
split.2 <- strsplit(split.2, "/")
lapply(split.2,
function(x, max.len) as.numeric(x)[match(0:max.len, as.numeric(x))],
max.len=max(as.numeric(unlist(split)))
) }

关于r - 在多行上按 '/' 一次拆分数千列,对新行中的值进行排序并添加 'NA' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21124838/

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