我在R中有一个data.frame;它被称为p
。 data.frame中的每个元素都是True或False。我的变量p
有 m 行和 n 列。对于每一行,严格只有一个TRUE
元素。
它还有列名,即字符串。我想做的是以下几点:
p
中的每一行,我看到TRUE
我想用相应列的名称替换FALSE
和列名称)折叠到一个向量中,该向量将包含 m 元素。我可以使用以下for循环执行第1步:
for (i in seq(length(colnames(p)))) {
p[p[,i]==TRUE,i]=colnames(p)[i]
}
但是这里没有美丽,我完全赞同这种for-loops-in-R-might-wrong-wrong心态。也许错误太强了,但肯定不是很好。
我真的不知道如何做第2步。我希望字符串和FALSE
的总和会返回字符串,但事实并非如此。我希望我可以使用某种类型的OR运算符,但不能完全弄明白(Python使用False or 'bob'
响应'bob'
)。因此,再一次,我呼吁你们美丽的Rstats人们寻求帮助!
答案 0 :(得分:4)
以下是一些示例数据:
df <- data.frame(a=c(FALSE, TRUE, FALSE), b=c(TRUE, FALSE, FALSE), c=c(FALSE, FALSE, TRUE))
您可以使用apply
执行以下操作:
names(df)[apply(df, 1, which)]
或直接使用apply
时没有which
:
idx <- which(as.matrix(df), arr.ind=T)
names(df)[idx[order(idx[,1]),"col"]]
答案 1 :(得分:3)
使用apply
清除索引,并使用该索引访问列名:
> df <- data.frame(a=c(TRUE,FALSE,FALSE),b=c(FALSE,FALSE,TRUE),
+ c=c(FALSE,TRUE,FALSE))
> df
a b c
1 TRUE FALSE FALSE
2 FALSE FALSE TRUE
3 FALSE TRUE FALSE
> colnames(df)[apply(df, 1, which)]
[1] "a" "c" "b"
>