Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何搜索具有相同名称的列、添加列值并用它们的总和替换具有相同名称的列?使用R_R - Fatal编程技术网

如何搜索具有相同名称的列、添加列值并用它们的总和替换具有相同名称的列?使用R

如何搜索具有相同名称的列、添加列值并用它们的总和替换具有相同名称的列?使用R,r,R,我有一个数据框,其中一些连续的列具有相同的名称。我需要搜索这些,为每行添加它们的值,删除一列,并用它们的总和替换另一列。 在之前不知道复制了哪些模式的情况下,可能需要将一个列名与以下列名进行比较,以查看是否存在匹配 有人能帮忙吗 提前感谢。一些示例数据 dfr <- data.frame( foo = rnorm(20), bar = 1:20, bar = runif(20), check.names = FALSE ) 要处理NA的问题: sapply(unique(

我有一个数据框,其中一些连续的列具有相同的名称。我需要搜索这些,为每行添加它们的值,删除一列,并用它们的总和替换另一列。 在之前不知道复制了哪些模式的情况下,可能需要将一个列名与以下列名进行比较,以查看是否存在匹配

有人能帮忙吗

提前感谢。

一些示例数据

dfr <- data.frame(
  foo = rnorm(20),
  bar = 1:20,
  bar = runif(20),
  check.names = FALSE
)
要处理NA的问题:

sapply(unique(names(dfrm)), 
      function(x) apply(dfrm[grep(x, names(dfrm))], 1, 
              function(y) if ( all(is.na(y)) ) {NA} else { sum(y, na.rm=TRUE) }
       )               )
(编辑注:通过在名称(.[.]结构周围加上唯一性,解决了Tommy反例。 错误代码是:

sapply(names(dfrm)[unique(duplicated(names(dfrm)))], 
     function(x) Reduce("+", dfrm[ , grep(x, names(dfrm))]) )

一种方法是使用
duplicated
函数(意外地)识别重复项,然后通过它们循环计算总和。以下是一个示例:

dat.dup <- data.frame(x=1:10, x=1:10, x=1:10, y=1:10, y=1:10, z=1:10, check.names=FALSE)
dups <- unique(names(dat.dup)[duplicated(names(dat.dup))])
for (i in dups) {
dat.dup[[i]] <- rowSums(dat.dup[names(dat.dup) == i])
}
dat <- dat.dup[!duplicated(names(dat.dup))]
dat.dup这是我的一行代码

# transpose data frame, sum by group = rowname, transpose back.
t(rowsum(t(dfrm), group = rownames(t(dfrm))))

关于‘Duh’:行和确实是行和,但行和超过列;-)谢谢你的回答。我曾经和“Duh”一起工作过,这不是我问题的主要问题!另外,如果我可以这样说的话,我认为“Duh”不是一个适合在这个论坛上发布的“功能”;)不适用于dfrm=data.frame(a=1:10,b=20:29,a=101:110,b=200:209,a=1001:1010,check.names=F)
@Tommy。谢谢指出我应该将唯一环绕名称(dfrm)[duplicated….]包装好。谢谢,尽管我怀疑行和会更快。我的数据缺少值。如何更改此函数以提供:1)如果一组变量中的所有列值都丢失,则为NA;2)如果至少有一个值,则为一个值。我尝试使用条件并检查NA的使用is.NA(),但失败了。不能使用na.rm=FALSE或TRUE。谢谢,这是我最初的想法,但我没有编码。我也不熟悉“独特”这个词。非常整洁,但值得注意的是,如果这是所需要的,那么在编写时需要
as.data.frame()
。@Henry。对可以很容易地将此输出转换为OP想要的任何格式。由于它使用调用C函数的
rowsum
,因此速度很快,在示例数据集上运行速度快1.5倍。我怀疑它在更大的数据帧上会更快。
sapply(names(dfrm)[unique(duplicated(names(dfrm)))], 
     function(x) Reduce("+", dfrm[ , grep(x, names(dfrm))]) )
dat.dup <- data.frame(x=1:10, x=1:10, x=1:10, y=1:10, y=1:10, z=1:10, check.names=FALSE)
dups <- unique(names(dat.dup)[duplicated(names(dat.dup))])
for (i in dups) {
dat.dup[[i]] <- rowSums(dat.dup[names(dat.dup) == i])
}
dat <- dat.dup[!duplicated(names(dat.dup))]
# transpose data frame, sum by group = rowname, transpose back.
t(rowsum(t(dfrm), group = rownames(t(dfrm))))