R версия 3.3.2 (31 октября 2016 г.). Используемые пакеты: vegan, plyr и bmble.
У меня есть два очень больших набора данных. Назовем их df1
и df2
. Каждый выглядит так:
Taxon Sam1001 Sam1002
Bacteria01 0.25 0
Bacteria02 0.11 0.34
«Хороший» набор данных — df1
. Он имеет 1885 наблюдений 3013 переменных. df2
имеет 1674 наблюдения 2377 переменных. При загрузке также появляется предупреждение:
See spec(...) for full column specifications.
Warning: 55 parsing failures.
row col expected actual
1062 SAMN032937893 no trailing characters .12E-07
1062 SAMN032936513 no trailing characters .12E-07
1062 SAMN032936373 no trailing characters .12E-07
1062 SAMN032936273 no trailing characters .12E-07
1062 SAMN032937943 no trailing characters .12E-07
.... ............. ...................... .......
See problems(...) for more details.
Я удаляю строку 1062, так как это кажется проблемой. Затем я запускаю следующий код:
df[df==0] <- NA
df2[df2==NA_integer_] <- NA #because NA_integer appears in the dataset df2
dfFreq <- apply(df, 2, count)
dfNARemoved <- lapply(dfFreq, function(x) transform(x[-nrow(x),]))
dfFreqxRemoved <- lapply(dfNARemoved, function(x) { x["x"] <- NULL; x
}) #removing useless x column
dfSum <- lapply(dfFreqxRemoved, function(x) sum(x))
df1
генерирует такой список:
List of 3013
$ X1 : int 1884
$ SAMN03073712 : int 191
$ SAMN03852278 : int 1
$ SAMN02142445 : int 100
$ SAMN03852340 : int 1
$ SAMEA2241190 : int 108
И т. д. Однако df2
генерирует такой список:
List of 38669
$ : num 1
$ : num 1
$ : num 1
$ : num 1
Редактировать: Моя общая цель состоит в том, чтобы взять большой набор данных операционных таксономических единиц (OTU), взятых из выборок копытных, и суммировать появление OTU для каждой выборки. Для df1
это создаст такую матрицу:
Sam1001 Sam1002
2 1
Используя этот код:
require(dplyr)
dfBound <- rbind(dfSum)
dfBoundData <- as.data.frame(dfBound)
dfBoundData$X1 <- NULL
transdfBoundData <- transform(dfBoundData, dfSum =
as.numeric(dfSum)) #although this works, it duplicates all of the rows
subttbd <- transdfBoundData[c(1, 2),]
subttbd <- subttbd[1,]
mat.subttbd <- data.matrix(subttbd)
После чего я бы создал график. Это успешно работает для df1
, но не работает для df2
.
Поскольку проблема связана с созданием списка, у меня возникает вопрос: как заставить df2
создать такой список, как df1
? В частности, что происходит во фреймах данных, из-за чего df2
выдает такой другой (и, в конечном счете, бесполезный, когда я пытаюсь манипулировать им дальше) результат?
Полезная(?) информация
- Я не предоставил никаких воспроизводимых данных, потому что наборы данных очень велики и внешне абсолютно одинаковы (как показано). Если бы я мог, я бы, наверное, смог понять, что происходит в "плохом"
df2
. - Я пробовал
str
,tail
,head
и все другие комбинации трюков, чтобы определить, есть ли мошеннические факторы или персонажи. похоже, в наборе данных одинаковое количество целых и числовых значений и один фактор (таксон).
df2
). - person E.O.   schedule 05.04.2017lapply(df, function(x) sum(!is.na(x)))
возвращает желаемый результат дляdf
? И если это так, это все еще дает неправильный результат дляdf2
? Кстати, предупреждение, которое он дает, это дляdf
илиdf2
? - person Marijn Stevering   schedule 05.04.2017df2
проблемный набор данных. Я свяжусь с вами, чтобы узнать, работает ли этот код (надеюсь, работает!). Интересно, что несмотря на то, что R вообще не изменил данные, теперь выдает ошибкуError in UseMethod("group_by_") : no applicable method for 'group_by_' applied to an object of class "character"
для шагаdfFreq <- apply(df, 2, count)
. Итак, мне нужно выяснить, что там происходит, прежде чем двигаться дальше. - person E.O.   schedule 05.04.2017df2
? Потому что ясно, что это не обычный data.frame. - person MrFlick   schedule 05.04.2017