Если у нас есть ваши данные в качестве data.frame с некоторыми изменениями в процентах.
month StockA StockB StockC
1 Jun 1927 1% 2% 3%
2 Jul 1927 3% 1% -4%
3 Aug 1927 6.4% 3% 4%
мы можем использовать apply для запуска функции в строках. Чтобы вернуть его в правильную форму, нам нужно применить транспонирование.
t(apply(df[, -1], 1, rank))
StockA StockB StockC
[1,] 1 2 3
[2,] 3 2 1
[3,] 3 1 2
# to replace the data in the data.frame
df[, -1] <- t(apply(df[, -1], 1, rank))
df
month StockA StockB StockC
1 Jun 1927 1 2 3
2 Jul 1927 3 2 1
3 Aug 1927 3 1 2
Теперь я просто оценил проценты как значения символов. Вы также можете использовать функцию akrun и сначала удалить знак%, установить его в числовое значение, а затем в ранг.
t(apply(df[, -1], 1, function(x) rank(as.numeric(sub("[%]", "", x)))))
В этом примере результат тот же. Но при многих процентах было бы лучше работать с реалами, а не с символами.
данные:
df <- structure(list(month = c("Jun 1927", "Jul 1927", "Aug 1927"),
StockA = c("1%", "3%", "6.4%"),
StockB = c("2%", "1%", "3%"),
StockC = c("3%", "-4%", "4%")),
.Names = c("month", "StockA","StockB", "StockC"),
class = "data.frame", row.names = c(NA, -3L))