gpt4 book ai didi

r - 使用耦合列从宽到长 : Is there a more R way to do this (i. e。 - 不使用 for 循环)?

转载 作者:行者123 更新时间:2023-12-04 09:45:06 24 4
gpt4 key购买 nike

我有一个如下所示的数据集:

phrase      wo1sp     wo2sp     wo3sp     wo1sc     wo2sc     wo3sc
hello dan mark todd 10 5 4
hello mark dan chris 8 9 4
goodbye mark dan kev 2 4 10
what kev dan mark 4 5 5

我想把它改成这样:

phrase      sp      sc
hello dan 10
hello mark 5
hello todd 4
hello mark 8
hello dan 9
hello chris 4
goodbye mark 2
goodbye dan 4
goodbye kev 10
what kev 4
what dan 5
what mark 5

我遇到的许多建议不依赖于相互耦合的数据列,因此这些建议最终会丢失诸如 gather 调用之类的信息。我问 this昨天的问题。

我已经这样解决了:

library("tidyverse")

test_set = tribble(~phrase, ~wo1sp, ~wo2sp, ~wo3sp, ~wo1sc, ~wo2sc, ~wo3sc,
"hello", "dan", "mark", "todd", 10, 5, 4,
"goodbye", "mark", "dan", "kev", 2, 4, 10,
"what", "kev", "dan", "mark", 4, 5, 5,
"hello", "mark", "dan", "mark", 4, 7, 10)

tmp_list <- list()
for (ii in 1:3) {
selected_data <- test_set %>%
group_by(phrase) %>%
select(matches(paste("wo", ii, "|phrase", sep="")))
names(selected_data) <- c("phrase", "sp", "sc")
tmp_list[[ii]] <- selected_data
}
ds <- do.call(rbind, tmp_list)

这正是我想要的,但感觉... hacky。在 R 中,我尽量避免循环和弄乱列名(直到最终清理)。甚至 select 语句都感觉很有趣。我相信有一种更清洁的方法可以做到这一点,但我花了很长时间(主要是使用 tidyr)试图弄清楚如何做,但一无所获。

有人有什么想法吗?

(重复的问题似乎是一样的,但这个问题的答案完全不同[而且更酷])

最佳答案

data.table 来救援..

library(data.table)
setDT(df)
melt(df, id.vars = "phrase", measure.vars = patterns(sp = "sp$", sc = "sc$"))
# phrase variable sp sc
#1: hello 1 dan 10
#2: hello 1 mark 8
#3: goodbye 1 mark 2
#4: what 1 kev 4
#5: hello 2 mark 5
#6: hello 2 dan 9
#7: goodbye 2 dan 4
#8: what 2 dan 5
#9: hello 3 todd 4
#10: hello 3 chris 4
#11: goodbye 3 kev 10
#12: what 3 mark 5

measure=patterns(sp = "sp$", sc = "sc$") 允许您指定遵循命名模式的相关列组,在这种情况下,所有 sp 列以 sp 结尾,其他列以 sc 结尾。因此,您将这两列作为输出。 variable 列是为您提供的附加信息,它告诉您数据来自列组的哪个原始列。

关于r - 使用耦合列从宽到长 : Is there a more R way to do this (i. e。 - 不使用 for 循环)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870876/

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