R 合并具有相似名称的列

R 合并具有相似名称的列,r,R,我正在使用一个名为data.frame的data.frame,它具有类似的列。表单有三个版本,并且版本被固定在列名的末尾,因此df看起来是这样的: var1 var2 var1x var2x var1y var2z 1 2 NA NA NA NA NA NA 1 2 NA NA NA NA 1 3 NA NA 4 NA NA NA NA

我正在使用一个名为data.frame的
data.frame
,它具有类似的列。表单有三个版本,并且版本被固定在列名的末尾,因此df看起来是这样的:

var1  var2  var1x  var2x  var1y  var2z
1     2     NA     NA     NA     NA
NA     NA   1       2     NA     NA
NA     NA   1      3      NA     NA
4     NA    NA    NA      NA    7
因此,除了最后一个字母外,有许多列具有相同的名称。我想把这些类似的专栏结合起来,这样我就可以得到这样的结论:

var1   var2 
1      2
1      2
1      3
4      7
list<-c("var1","var2")
get_col<-function(var){
  rowMeans(df[,grepl(var,names(df))],na.rm=TRUE)
}
newdf<-data.frame(do.call(cbind,lapply(list,get_col)))
names(newdf)<-list



   var1 var2
1    1    2
2    1    2
3    1    3
4    4    7
5  NaN  NaN
有什么想法吗

编辑:任何变量都不可能有多个答案。例如,如果var1是2,那么var1x和var1y是NA

还有一个想法:

var1<-rowMeans(df[,grepl("var1",names(df))],na.rm=TRUE)
var2<-rowMeans(df[,grepl("var2",names(df))],na.rm=TRUE)
cbind(var1,var2)

     var1 var2
[1,]    1    2
[2,]    1    2
[3,]    1    3
[4,]    4    7
library(dplyr)

df %>% 
  transmute(n_var1 = rowMeans(select(., starts_with("var1")), na.rm = TRUE),
            n_var2 = rowMeans(select(., starts_with("var2")), na.rm = TRUE))
其中:

#  n_var1 n_var2
#1      1      2
#2      1      2
#3      1      3
#4      4      7

另一个选项是根据列名中的公共前缀
拆分列,在逻辑矩阵(
!is.na(x1)
)上创建一个列索引
max.col
cbind
和行索引(
1:nrow(x1)
)来获取每行的非na元素

sapply(split(names(df1), sub('[^0-9]*$', '',names(df1))), function(x) {
         x1 <- df1[x]
         x1[cbind(1:nrow(x1), max.col(!is.na(x1)))]})
#     var1 var2
#[1,]    1    2
#[2,]    1    2
#[3,]    1    3
#[4,]    4    7
数据
df1我实际上不会这么做,但这里有一个使用排序的答案(按变量的前4个字符排序,然后按实际值排序):

产生:

     [,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    1    3
[4,]    4    7    

应该对所有NA都有鲁棒性。

我猜既然@Alex说有不同的版本,就不会有两个版本不缺失的情况。很抱歉出现歧义。如果缺少所有var1,则应返回NA。(例如,如果该人没有填写任何表格上第一个问题的任何内容,就会发生这种情况)我有同样的疑问:如果Var1表示2,var1x表示3,那么您希望生成的Var1列表示5吗?i、 e.数字之和?@rawr:这确实与列名有关,因为您将
var1
替换为
var1x
,而不是
var2x
@BrodieG,好吗?如果只有一列,它也会失败。对于三维阵列来说也是失败的。如果NAs是0或unicorns,它也会失败。我根据给出的例子进行了评论。我不知道我需要飞航天飞机谢谢。例如,如果person1的所有var1都丢失了,我会担心这种行为。那么var1和var2的长度就不一样了,R将开始回收,对吗?我很困惑。您说过当所有值都是
NA
时,
rowMeans()
将产生
NaN
,但随后您说您使用了
rowMeans()
,因为当所有值都是
NA
时,它返回
NA
。这是自相矛盾的,因为
NaN
!=<代码>不适用
。您的意思是在其中一种情况下使用
rowSums()
?我编辑了一下,以便更清楚一些。为此,我将
NaN
等同于
NA
,因为它消除了
rowSums
所做的行为,这是为了给这样的人
0
。由于
NA
NA
不一样,我建议在最后使用
is.finite()转换为
NA
或类似的。
NaN
很容易处理。但是如果我能给你自动编辑的加分,我会的。谢谢@akrun,是的,这非常粗糙。@akrun如果函数定义只允许R
f(x)
。)
df1 <- structure(list(var1 = c(1L, NA, NA, 4L), var2 = c(2L, NA, NA, 
NA), var1x = c(NA, 1L, 1L, NA), var2x = c(NA, 2L, 3L, NA), var1y = c(NA, 
NA, NA, NA), var2z = c(NA, NA, NA, 7L)), .Names = c("var1", "var2", 
"var1x", "var2x", "var1y", "var2z"), class = "data.frame",
row.names = c(NA, -4L))
t(apply(DF, 1, function(x) x[order(substr(names(DF), 1, 4), x)]))[, c(1, 4)]
     [,1] [,2]
[1,]    1    2
[2,]    1    2
[3,]    1    3
[4,]    4    7