我有一个数据框,例如:
x <- data.frame("Names"= c("name1","name2","name3"), "A" = c(0.1,0.1,0.8), "B" = c(0.3,0.4,0.3), "C" = c(0.05,0.9,0.05),"D" =c(0.6,0.1,0.3))
> x
Names A B C D
1 name1 0.1 0.3 0.05 0.6
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3
我想删除A,B,C或D的最大值低于0.8的所有行。然后,获取:
> x
Names A B C D
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3
名称1被删除,因为最大值为0.6。
然后,我想获取一个文件,例如,我获得NameX的列名称为最大值,在此示例中为:
Name1 : C with value 0.9
Name2 : A with value 0.8
谢谢您的帮助。
答案 0 :(得分:2)
您可以使用pmax
,即
x[do.call(pmax, x[-1]) >= 0.8,]
# Names A B C D
#2 name2 0.1 0.4 0.90 0.1
#3 name3 0.8 0.3 0.05 0.3
答案 1 :(得分:1)
要过滤行,您可以使用any
df <- x[apply(x[, -1], 1, function(x) any(x >= 0.8)), ]
df
# Names A B C D
#2 name2 0.1 0.4 0.90 0.1
#3 name3 0.8 0.3 0.05 0.3
关于第二个问题,我不确定您要做什么。如果这是关于生成{result”字符串的vector
,则可以
apply(df, 1, function(x) {
idx <- which.max(x[-1])
sprintf("%s: %s with value %s", x[1], colnames(df)[idx + 1], x[-1][idx]) })
# 2 3
#"name2: C with value 0.90" "name3: A with value 0.8"
或者,如果您喜欢data.frame
,也许是这样的
ret <- data.frame(result = rep("", nrow(df)), stringsAsFactors = F)
for (i in 1:nrow(df)) {
idx <- which.max(df[i, -1])
ret$result[i] <- sprintf(
"%s: %s with value %s",
df[i, 1], colnames(df)[idx + 1], df[i, -1][idx])
}
ret
# result
#1 name2: C with value 0.9
#2 name3: A with value 0.8
答案 2 :(得分:1)
x[rowSums(x[-1] >= 0.8) != 0, ]
Names A B C D
2 name2 0.1 0.4 0.90 0.1
3 name3 0.8 0.3 0.05 0.3
答案 3 :(得分:1)
data.table解决方案:
x <- data.table::data.table(x)
x [ pmax(A,B,C,D) >= .8 , , ]
x [ , paste(colnames(x)[1+which(c(A,B,C,D)==(max(A,B,C,D)))], " with value ", max(A,B,C,D)), by=Names]