2016-04-30 56 views
0

我试图获取单元格值为1的每行的列名称。但是我的尝试没有奏效,但任何人都可以提供建议吗?获取与数据框中的特定行值相匹配的列名称

library(permute) 
set.seed(42) 
exampledf<- data.frame(allPerms(c(1,2,3,4))) 
exampledf<-head(exampledf) 

我尝试这样做:

apply(exampledf,2,function(x){ 
    ll<-x[1]==1 
    which(ll==T) 
    }) 

数据集

X1 X2 X3 X4 
1 1 2 4 3 
2 1 3 2 4 
3 1 3 4 2 
4 1 4 2 3 
5 1 4 3 2 
6 2 1 3 4 

我的目标:

X1 
X1 
X1 
X1 
X1 
X2 
+0

哎呀,没错....固定的问题,现在 – Rilcon42

+2

尝试像'名字(exampledf)最大。 col(exampledf == 1)]' –

回答

4

这是一个方法:

# construct sample data.frame 
set.seed(1234) 
df <- data.frame(matrix(
       c(sample(1:4, 4), sample(1:4, 4), 
        sample(1:4, 4), sample(1:4, 4)), 
       ncol=4, byrow=T)) 
# name data.frame 
names(df) <- c(paste0("x", 1:4)) 

# get names of variables 
names(df)[apply(df, 1, function(i) which(i == 1))] 

通过@DavidArenburg提出一种方法,那就是可能更快(特别是对于大型数据集)是

names(df)[which(df == 1, arr.ind=T)[, "col"]] 

,因为它并不需要使用功能apply

注:我构建了不同的data.frame,因为我没有permute包。

+1

你不需要运行'apply'来使用'which'。只是'名称(df)[其中(df == 1,arr.ind = TRUE)[,“col”]]'将会执行。 –

+0

@DavidArenburg哇。 arr.ind参数的另一个用途。谢谢你的提示。我会将其添加到我的答案。 – lmo

1

我希望得到你的问题的权利(应不是最后的匹配列是X2而不是X3?)。有点古老,但如果我找到你的权利,这应该做到这一点。

library(permute) 
set.seed(42) 
exampledf <- data.frame(allPerms(c(1,2,3,4))) 
exampledf <- head(exampledf) 

matched_cols = c() 
for(i in 1:nrow(exampledf)){ 
    row <- edf[i, ] == 1 
    matched_col <- colnames(exampledf)[row == T] 
    matched_cols = c(matched_cols, matched_col) 
} 
matched_cols 
+0

避免在R或任何其他语言中增长对象通常是一个好主意。如果知道要填充的对象的大小(此处等于数据帧的行数),则预先分配该大小的矢量以存储数据要好得多。在下面的'exampledf < - head ...'你应该初始化你的matched_cols矢量:'matched_cols < - integer(nrow(exampledf))''。然后你可以使用'matched_cols [i] < - ...'来填充matched_cols,并且保存R必须为每次迭代重复复制matched_cols的努力。 – lmo

0

另一种简单的方法:

library(permute) 
set.seed(42) 
exampledf<- data.frame(allPerms(c(1,2,3,4))) 

for(i in 1:nrow(exampledf)){ 
    for (j in 1:length(exampledf[i,])){ 
     if(exampledf[i,j]==1){ 
      print(names(exampledf)[j]) 
     } 
    } 
} 

示例输出是:

“X1”

“X1”

“X1”

“X1”

“X1”

“X2”

“X2”

“X3”

相关问题