如果值等于X,则保留行名和列名

时间:2016-04-08 08:26:00

标签: r

以下数据集

  a b c d e 
X 1 1 1 1 0
Z 1 0 0 1 0
Y 0 0 0 0 0

我想创建列表。当列中至少有一个值等于1时,一个具有所有列名称。一个列表,其中包含所有行名称(X,Z,Y),每当至少一个行元素的值为1时。

我试过了:

df[Reduce(`|`, as.data.frame(lapply(df)), function(x) x %in% 1),]

没有结果。

最后我想要

x=(a,b,c,d) and z=(X,Z)

2 个答案:

答案 0 :(得分:5)

使用

df <- read.table(text = "  a b c d e 
X 1 1 1 1 0
Z 1 0 0 1 0
Y 0 0 0 0 0", header = T)

> df
#   a b c d e
# X 1 1 1 1 0
# Z 1 0 0 1 0
# Y 0 0 0 0 0


names(which(colSums(df == 1) > 0))
# [1] "a" "b" "c" "d"

names(which(rowSums(df == 1) > 0))
# [1] "X" "Z"

答案 1 :(得分:1)

您可以这样做:

df <- read.csv("data.csv")
row.names(df) <- c("X","Y","Z")

df看起来像这样(我在这里使用XYZ,而在你的例子中你使用了XZY,但想法是一样的):

  a b c d e
X 1 1 1 1 0
Y 1 0 0 1 0
Z 0 0 0 0 0

然后根据条件获取行和列:

x = colnames(df)[apply(df, 2, function(value) any(value==1))]
z = row.names(df)[apply(df, 1, function(value) any(value==1))]

这会给你:

> print(x)
[1] "a" "b" "c" "d"
> print(z)
[1] "X" "Y"