gpt4 book ai didi

逐行排序然后跨数据框的特定列连接

转载 作者:行者123 更新时间:2023-12-04 07:21:24 25 4
gpt4 key购买 nike

(相关 question 不包括排序。当您不需要排序时,只需使用 paste 很容易。)

我有一个不太理想的结构表,其中包含通用“item1”、“item2”等字符列。我想创建一个新的字符变量,它是这些列的字母顺序、逗号分隔的串联。例如,在第 5 行中,如果 item1 = "milk"、item2 = "eggs"和 item3 = "butter",则第 5 行中的新变量可能是“butter、egs、milk”

我写了一个函数 f()下面这适用于两个字符变量。但是,我遇到了麻烦

  • 使用 mapply或其他“矢量化”(我知道它实际上只是一个 for 循环)
  • 将函数推广到任意数量的列

  • 非常感谢任何帮助。
    df <- data.frame(a =c("foo","bar"), 
    b= c("baz","qux"))
    paste(df$a,df$b, sep=", ")
    # returns [1] "foo, baz" "bar, qux" ... but I want [1] "baz, foo" "bar, qux"

    f <- function(a,b) paste(c(a,b)[order(c(a,b))],collapse=", ")
    f("foo","baz")
    # returns [1] "baz, foo" ... which is what I want ... how to vectorize?

    df$new_var <- mapply(f, df$a, df$b)
    df
    # a b new_var <- new_var is not what I want
    # 1 foo baz 1, 2
    # 2 bar qux 1, 2

    # Interestingly, data.table is smart enough to fix my bad mapply
    library(data.table)
    dt <- data.table(a =c("foo","bar"),
    b= c("baz","qux"))
    dt[,new_var:=mapply(f, a, b)]
    dt
    # a b new_var <- new var IS what I want
    # 1: foo baz baz, foo
    # 2: bar qux bar, qux

    最佳答案

    我的第一个想法是这样做:

    dt[, new_var := paste(sort(.SD), collapse = ", "), by = 1:nrow(dt)]

    但是您可以通过一些简单的修改使您的函数工作:
    f = function(...) paste(c(...)[order(c(...))],collapse=", ")

    dt[, new_var := do.call(function(...) mapply(f, ...), .SD)]

    关于逐行排序然后跨数据框的特定列连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28730186/

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