获取与数据框

时间:2016-04-30 20:38:55

标签: r

我正在尝试获取单元格值为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

4 个答案:

答案 0 :(得分:5)

这是一种方法:

# 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 :(得分: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

答案 2 :(得分: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])
        }
    }
}

示例输出为:

&#34; X1&#34;

&#34; X1&#34;

&#34; X1&#34;

&#34; X1&#34;

&#34; X1&#34;

&#34; X2&#34;

&#34; X2&#34;

&#34; X3&#34;

答案 3 :(得分:-1)

如果数据框在这些列中有多个值1,则可以使用此方法实现,尽管它也可以用于一个值

exampledf$results<-c() # Adding one empty column called results here 
for(i in (1:nrow(exampledf))){
    exampledf$results[i] <- paste((colnames(exampledf)[which(exampledf[i,1:(ncol(exampledf)-1)] ==  1)]),collapse = ",")
}

希望这对这个帖子有用