我有一些像这样的数据
A B C D
[1,] 23 23 12 34
[2,] 12 13 11 9
[3,] 70 80 67 76
[4,] 43 23 25 40
我想生成两个新变量。
每行的最小数量
最小值的列名
即。结果应该是:
A B C D min minCol
1 23 23 12 34 12 C
2 12 13 11 9 9 D
3 70 80 67 76 67 C
4 43 23 25 40 23 B
我已经尝试了下面的脚本,我确实得到了“min”变量,但是,当我尝试生成“minCol”时,一些值被放下为“min”,而不是A,B, C或D.
data <- transform(data, min=apply(data[,c(1:4)],1, min,na.rm = TRUE))
运行之后,我得到了以下数据框,这很好。
A B C D min
1 23 23 12 34 12
2 12 13 11 9 9
3 70 80 67 76 67
4 43 23 25 40 23
然后我运行以下脚本
data <- data.frame(data, minCol= apply(data, 1, function(row)
{colnames(data)[[which.min(row)]]}))
并得到类似的东西
A B C D min minCol
1 23 23 12 34 12 C
2 12 13 11 9 9 D
3 70 80 67 76 67 C
4 43 23 25 40 23 min
有人可以帮忙吗?
答案 0 :(得分:1)
一种简单的方法是(假设您的数据称为df
)
df[c("min", "minCol")] <- t(apply(df, 1, function(x) c(min(x), names(x[which.min(x)]))))
df
# A B C D min minCol
# 1 23 23 12 34 12 C
# 2 12 13 11 9 9 D
# 3 70 80 67 76 67 C
# 4 43 23 25 40 23 B
另一种方法(由@akrun提供)将是pmin
,do.call
和max.col
val <- do.call(pmin, c(df, na.rm = TRUE))
transform(df, min=val, minCol = names(df)[max.col(df == val, 'first')])
数据强>
df <- structure(list(A = c(23L, 12L, 70L, 43L), B = c(23L, 13L, 80L,
23L), C = c(12L, 11L, 67L, 25L), D = c(34L, 9L, 76L, 40L)), .Names = c("A",
"B", "C", "D"), class = "data.frame", row.names = c("1", "2",
"3", "4"))