gpt4 book ai didi

regex - 每两列相减

转载 作者:行者123 更新时间:2023-12-04 11:49:15 27 4
gpt4 key购买 nike

想象一下我有一个这样的数据框(或所有月份的名称)

set.seed(1)
mydata <- data.frame()
mydata <- rbind(mydata,c(1,round(runif(20),3)))
mydata <- rbind(mydata,c(2,round(runif(20),3)))
mydata <- rbind(mydata,c(3,round(runif(20),3)))
colnames(mydata) <- c("id", paste0(rep(c('Mary', 'Bob', 'Dylan', 'Tom', 'Jane', 'Sam', 'Tony', 'Luke', 'John', "Pam"), each=2), 1:2))

.
id Mary1 Mary2  Bob1  Bob2 Dylan1 Dylan2  Tom1  Tom2 Jane1 Jane2  Sam1  Sam2 Tony1 Tony2 Luke1 Luke2 John1 John2  Pam1  Pam2
1 0.266 0.372 0.573 0.908 0.202 0.898 0.945 0.661 0.629 0.062 0.206 0.177 0.687 0.384 0.770 0.498 0.718 0.992 0.380 0.777
2 0.935 0.212 0.652 0.126 0.267 0.386 0.013 0.382 0.870 0.340 0.482 0.600 0.494 0.186 0.827 0.668 0.794 0.108 0.724 0.411
3 0.821 0.647 0.783 0.553 0.530 0.789 0.023 0.477 0.732 0.693 0.478 0.861 0.438 0.245 0.071 0.099 0.316 0.519 0.662 0.407

通常有更多的列。

而且我想添加列(由您决定将它们添加到右侧,或者使用这些新列创建一个新的数据框)每两个减去.. (*)
id, Mary1-Mary2,  Bob1-Bob2,  Dylan1-Dylan2,  Tom1-Tom2,  Jane1-Jane2,...

这种操作很常见。

我想按名称而不是按位置来做,以防止出现不连续的问题。
甚至可能发生某些列没有它的“双”列,就保持原样,或者现在忽略这种复杂情况。

(*) 列的名称有一个前缀和一个数字。
我可以有 5 组,而不是仅仅减去两列,我可能想做一些事情,例如添加所有数字。一个通用的解决方案会很棒。

我首先尝试通过将其转换为长格式来做到这一点,然后使用聚合进行操作,然后将其转换回宽格式,但也许直接以宽格式进行操作要容易得多。我知道这个问题主要与有效地使用正则表达式有关。

R, data.table or dplyr, long format splitting colnames

我不介意速度,但最简单的解决方案。
任何包裹都是受欢迎的。

PD:如果我添加一个单独的列,你所有的代码都会失败。
set.seed(1)
mydata <- data.frame()
mydata <- rbind(mydata,c(1,round(runif(21),3)))
mydata <- rbind(mydata,c(2,round(runif(21),3)))
mydata <- rbind(mydata,c(3,round(runif(21),3)))
colnames(mydata) <- c(c("id", paste0(rep(c('Mary', 'Bob', 'Dylan', 'Tom', 'Jane', 'Sam', 'Tony', 'Luke', 'John', "Pam"), each=2), 1:2)),"Lola" )

我知道我可以手动过滤掉它,但如果结果是每对的差异 (*) 而不管孤独的列,那就更好了。 (如果两个大小的组有差异)

最好的选择不是手动删除第一列,而是将所有列拆分为单列和多列。

最佳答案

如何使用基础 R:

cn <- unique(gsub("\\d", "", colnames(mydata)))[-1]
sapply(cn, function(x) mydata[[paste0(x, 1)]] - mydata[[paste0(x, 2)]] )

您可以将这种方法用于任意数量的组。例如,这将返回后缀为 1 或 2 的名称的行总和:
sapply(cn, function(x) rowSums(mydata[, paste0(x, 1:2)]))

对于更一般的应用程序,这种粘贴方法可以用正则表达式代替。

关于regex - 每两列相减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37023999/

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