5
votes

Here is a sample data frame:

df <- data.frame(t1 = c(1,2,3,4), t2 = c(7,3,8,1), t3 = c(1,1,1,1))

df
  t1 t2 t3
1  1  7  1
2  2  3  1
3  3  8  1
4  4  1  1

My goal is to remove the max value from each column. However, for columns like t3, where all values in the column are equal, I would simply remove a single value so that all three columns in the data frame end up with three rows, like below:

df2
  t1 t2 t3
1  1  7  1
2  2  3  1
3  3  1  1
2

2 Answers

4
votes

Try

library(data.table)
 setDT(df)[, lapply(.SD, function(x) x[-which.max(x)])]
4
votes

How about just using which.max since that would select just one value (i.e. the index of the first occurrence of the maximum value):

as.data.frame(lapply(df, function(x) x[-which.max(x)]))
#   t1 t2 t3
# 1  1  7  1
# 2  2  3  1
# 3  3  1  1