gpt4 book ai didi

r - 根据列名在数据框中添加两列

转载 作者:行者123 更新时间:2023-12-05 01:10:27 26 4
gpt4 key购买 nike

示例:我有一个数据框

> a = data.frame(T_a_1=c(1,2,3,4,5),T_a_2=c(2,3,4,5,6),T_b_1=c(3,4,5,6,7),T_c_1=c(4,5,6,7,8),length=c(1,2,3,4,5))
> a
T_a_1 T_a_2 T_b_1 T_c_1 length
1 2 3 4 1
2 3 4 5 2
3 4 5 6 3
4 5 6 7 4
5 6 7 8 5

我想根据名称在列上添加(或执行一些其他操作,例如 (column1+column2)/length。
就像 T_a(T_a_1 和 T_a_2)是两列(第一和第二)之间的通用名称,所以我想添加它们。

最佳答案

我会使用 grep作业的命令将列名与某些模式匹配。这里有些例子:

> a = data.frame(T_a_1=c(1,2,3,4,5),
+ T_a_2=c(2,3,4,5,6),
+ T_b_1=c(3,4,5,6,7),
+ T_c_1=c(4,5,6,7,8),
+ length=c(1,2,3,4,5))
>
> # display only columns that match T_a
> a[,grep('T_a', colnames(a))]
T_a_1 T_a_2
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
>
> # sum
> sum(a[,grep('T_a', colnames(a))])
[1] 35
>
> #rowsum
> rowSums(a[,grep('T_a', colnames(a))])
[1] 3 5 7 9 11
>
> # your example (row1 + row2) / length
> rowSums(a[,grep('T_a', colnames(a))]) / a$length
[1] 3.000000 2.500000 2.333333 2.250000 2.200000

更新:

从下面的评论中,我了解到您想要对按公共(public)前缀分组的匹配行求和并除以长度列。以下代码是该问题的一个不优雅的解决方案:
> a = data.frame(ES51_223_1=c(1,2,3,4,5),
+ ES51_312_1=c(2,3,4,5,6),
+ ES52_223_2=c(3,4,5,6,7),
+ ES52_312_2=c(4,5,6,7,8),
+ ES53_223_3=c(1,2,3,4,5),
+ length=c(1,2,3,4,5))
>
> # get the unique prefixes
> prefixes = unique(unlist(lapply(colnames(subset(a, select=-length)), function(x) { strsplit(x, '_')[[1]][[1]]})))
>
> f = function(prefix) {
+ return (rowSums(subset(a, select=grep(prefix, colnames(a)))) / a$length)
+ }
> m = matrix(unlist(lapply(prefixes, f)), nrow=nrow(a))
> colnames(m) = prefixes
> m
ES51 ES52 ES53
[1,] 3.000000 7.000000 1
[2,] 2.500000 4.500000 1
[3,] 2.333333 3.666667 1
[4,] 2.250000 3.250000 1
[5,] 2.200000 3.000000 1
m是包含不同列中不同前缀结果的矩阵。

关于r - 根据列名在数据框中添加两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14944434/

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