如何连接每行的列和列名,不包括r中的特定值
我有一个数据帧:如何连接每行的列和列名,不包括r中的特定值,r,R,我有一个数据帧: df = read.table(text="X1 X2 X3 X4 X5 X6 X7 C U C D B C C D C B A C D U D C B A C D D C D U U B C D C D B D C U C D C C A B C D U D C U U C C", header
df = read.table(text="X1 X2 X3 X4 X5 X6 X7
C U C D B C C
D C B A C D U
D C B A C D D
C D U U B C D
C D B D C U C
D C C A B C D
U D C U U C C", header=T, stringsAsFactors=F)
我想分别连接每行的所有列及其列名,但不包括带有“U”的列。要找出哪些行和列有“U”,请使用
预期结果如下:
output = read.table(text="'X1 X3 X4 X5 X6 X7' 'C C D B C C'
'X1 X2 X3 X4 X5 X6' 'D C B A C D'
'X1 X2 X3 X4 X5 X6 X7' 'D C B A C D D'
'X1 X2 X5 X6 X7' 'C D B C D'
'X1 X2 X3 X4 X5 X7' 'C D B D C C'
'X1 X2 X3 X4 X5 X6 X7' 'D C C A B C D'
'X2 X3 X6 X7' 'D C C C'", header=F, stringsAsFactors=F)
我不知道如何在不使用循环的情况下获得预期的结果。谢谢。一个更简单的选择是
应用,使用边距=1
t(apply(df, 1, function(x) {
i1 <- x!="U"
c(V1=paste(names(x)[i1], collapse=" "),
V2= paste(x[i1], collapse=" ")) }))
或者像@RHertel提到的那样
gsub("\\sU|U\\s","",do.call(paste,df))
一个更简单的选择是apply
,其中MARGIN=1
t(apply(df, 1, function(x) {
i1 <- x!="U"
c(V1=paste(names(x)[i1], collapse=" "),
V2= paste(x[i1], collapse=" ")) }))
或者像@RHertel提到的那样
gsub("\\sU|U\\s","",do.call(paste,df))
下面是使用grepl
查找字符索引的另一种方法
res=t(apply(df, 1, function(x)
c(v1=paste(names(x)[which(grepl("U", x)==F)], collapse = " "),
v2=paste(x[which(grepl("U", x)==F)], collapse = " "))
))
下面是使用grepl
查找字符索引的另一种方法
res=t(apply(df, 1, function(x)
c(v1=paste(names(x)[which(grepl("U", x)==F)], collapse = " "),
v2=paste(x[which(grepl("U", x)==F)], collapse = " "))
))
你的意思是df!=“U”
,对吗?一个更简单的选项是apply
使用MARGIN=1
。i、 你的意思是df!=“U”
,对吧?一个更简单的选择是apply
带MARGIN=1
。也就是t(apply)(df,1,function(x){i1@RHertel谢谢你,我以前没有注意到。@RHertel谢谢你,我以前没有注意到。