Р: два, казалось бы, одинаковых набора данных, но один работает, а другой нет?

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 и все другие комбинации трюков, чтобы определить, есть ли мошеннические факторы или персонажи. похоже, в наборе данных одинаковое количество целых и числовых значений и один фактор (таксон).

person E.O.    schedule 05.04.2017    source источник
comment
Можете ли вы объяснить, какова общая цель кода и что представляют результаты (предполагаемые)? Мне трудно понять, что именно ты делаешь.   -  person Marijn Stevering    schedule 05.04.2017
comment
Извините, я пытался сделать это простым, но я думаю, это было слишком просто! Моя общая цель — создать разрежение OTU видно здесь. Я обновлю вопрос следующими шагами.   -  person E.O.    schedule 05.04.2017
comment
Кстати, я не следую коду, предложенному в приведенной выше ссылке, а просто использую эти графики в качестве примера того, чего я в конечном итоге достигну с помощью этой многословной манипуляции с набором данных.   -  person E.O.    schedule 05.04.2017
comment
Таким образом, вы пытаетесь создать список, в котором указано, сколько значений, отличных от NA, приходится на столбец?   -  person Marijn Stevering    schedule 05.04.2017
comment
Точно, при сохранении имен столбцов (в отличие от списка df2).   -  person E.O.    schedule 05.04.2017
comment
этот код: lapply(df, function(x) sum(!is.na(x))) возвращает желаемый результат для df? И если это так, это все еще дает неправильный результат для df2? Кстати, предупреждение, которое он дает, это для df или df2?   -  person Marijn Stevering    schedule 05.04.2017
comment
Предупреждение, которое он дает, если для df2 проблемный набор данных. Я свяжусь с вами, чтобы узнать, работает ли этот код (надеюсь, работает!). Интересно, что несмотря на то, что 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.2017
comment
@MarijnStevering Я смог во всем разобраться и использовать ваш код, который отлично работал. Большое спасибо! Гораздо умнее и короче, чем неуклюжий метод, который я использовал.   -  person E.O.    schedule 05.04.2017
comment
Может быть, покажите, как какой код вы запускаете, чтобы сделать df2? Потому что ясно, что это не обычный data.frame.   -  person MrFlick    schedule 05.04.2017


Ответы (1)


Большое спасибо Marijin Stevering за ответ:

lapply(df, function(x) sum(!is.na(x)))

Что также аккуратно вырезает несколько ступеней.

person E.O.    schedule 05.04.2017