大家好我想用R中的数据框解决一个小问题。我有一个这种风格的数据框(我在最后部分添加了dput()
版本):
ID x1 x2 x3 x4 x5
1 ab F F G G G
2 an A B F G G
3 am B B B C B
4 ap F F F F F
5 aq A B C F G
我正在尝试构建一个应用于每一行的函数。此函数标识一行中的任何F
,F
位置后的值将填充F
。我想得到这样的东西:
ID x1 x2 x3 x4 x5
1 ab F F F F F
2 an A B F F F
3 am B B B C B
4 ap F F F F F
5 aq A B C F F
例如,在第一行中,您可以看到此行有3 F
,在最后F
之后,所有元素都填充了G
。对于具有任何F
的其他行,也会发生相同的情况。对于我来说,使用索引是如此复杂,我尝试使用if
这样的解决方案:
Base[-1] <- t(apply(
Base[-1],
1,
function(x) {
if("F" %in% x) {
x[which.max(x=="F"):length(x)]="F"
} else
x
}
))
我得到的结果不正确:
ID x1 x2 x3 x4 x5
1 ab F F B F F
2 an F F B F F
3 am F F B F F
4 ap F F C F F
5 aq F F B F F
我的数据框dput()
的{{1}}版本是下一个:
Base
非常感谢你的帮助。
答案 0 :(得分:0)
你非常接近 which.max(x =='F')正在查看0和1的向量而不是索引号
Base <- structure(list(ID = c("ab", "an", "am", "ap", "aq"), x1 = c("F",
"A", "B", "F", "A"), x2 = c("F", "B", "B", "F", "B"), x3 = c("G",
"F", "B", "F", "C"), x4 = c("G", "G", "C", "F", "F"), x5 = c("G",
"G", "B", "F", "G")), .Names = c("ID", "x1", "x2", "x3", "x4",
"x5"), row.names = c(NA, -5L), class = "data.frame")
Base[-1] <- t(apply(
Base[-1],
1,
function(x) {
if("F" %in% x) {
x[max(which(x=="F")):length(x)]="F"
}
x }
))
应该有效
Base
ID x1 x2 x3 x4 x5
1 ab F F F F F
2 an A B F F F
3 am B B B C B
4 ap F F F F F
5 aq A B C F F