R 合并具有相似名称的列
我正在使用一个名为data.frame的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
,它具有类似的列。表单有三个版本,并且版本被固定在列名的末尾,因此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如果函数定义只允许Rf(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