Как видно из вышеприведенных сообщений, список не может быть дифференцирован между List & lt; Object & gt;
и List & lt; String & gt;
или List & lt; Integer & gt;
.
Я решил это сообщение об ошибке для аналогичной проблемы:
List & lt; String & gt; strList = (List & lt; String & gt;) someFunction (); Строка s = strList.get (0);
со следующим:
List & lt;? & gt; strList = (List & lt;? & gt;) someFunction (); String s = (String) strList.get (0);
Объяснение: Преобразование первого типа проверяет, что объект является списком, не заботясь о типах, находящихся внутри (поскольку мы не можем проверить внутренние типы на уровне списка). Второе преобразование теперь требуется, потому что компилятор знает, что List содержит какие-то объекты. Это проверяет тип каждого объекта в Списке по мере его доступа.
Вот одна возможность:
df$colMax <- apply(df, 1, function(x) max(x[x != 9]))
Функция pmax
была бы полезной здесь. Единственный улов состоит в том, что в качестве параметров требуется куча векторов. Вы можете преобразовать data.frame в параметры с помощью do.call
. Я также установил 9 значений в NA, как это было предложено другими, но сделайте это, используя несколько нетрадиционную команду is.na<-
.
do.call(pmax, c(`is.na<-`(df, df==9), na.rm=T))
# [1] 5 6 7
Замените 9
на NA
, а затем используйте pmax
, как было предложено @MrFlick в его удаленном ответе:
df2 <- df #copy df because we are going to change it
df2[df2==9] <- NA
do.call(function(...) pmax(..., na.rm=TRUE), df2)
#[1] 5 6 7
do.call(pmax, DF)
дает тот же результат, что и apply(DF, 1, max)
(при условии, что DF
- это data.frame со всеми числовыми столбцами), но быстрее в 100 раз на data.frame с 2 столбцами и 1e4 строками. Если вы не понимаете документацию, посмотрите на раздел примеров и поиграйте с функцией.
– Roland
10 July 2014 в 12:10
#make a copy of your data.frame
tmp.df <- df
#replace the 9s with NA
tmp.df[tmp.df==9] <- NA
#Use apply to process the data one row at a time through the max function, removing NA values first
apply(tmp.df,1,max,na.rm=TRUE)