以下数据集
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)
答案 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"