2017-02-15 20 views
0

У меня была проблема с некоторыми из моего кода, и я установил его, но не в полной мере понять, почему ошибка произошла ошибкаR типаж NA против строки

код выглядел так:

for(i in 1:3){df = rbind.fill(z, data.frame(id=i, 
data=if(is.null(x$results[[i]]$synopsis$data))  
{NA}else{x$results[[i]]$synopsis$data}))} 

В вопрос, который у меня был, если первое значение данных действительно было нулевым, я бы получил NA, но затем для второго и третьего я либо получил бы еще NA, либо если бы были данные, я бы не получил его, я бы получил 1.

Если первое значение было данными, я бы получил данные, а для двух других я либо получил бы NA, либо правильные данные.

Я не компьютерный ученый, но разработчик, который сидит рядом со мной (но не знает R), предположил, что это как-то связано с различными машинами NA и строкой. Чтобы решить проблему, я изменил NA на "0" (я полагаю, что "NA" тоже будет работать).

Мне просто хотелось бы получить более подробное объяснение происходящего. Понимание моего непрофессионала, если NA был первым результатом, тогда каждый результат находится в этом «формате», где что-то либо NA, либо нет, а не обрабатывается как 1, что своего рода вроде булевого ответа?

Пример:

my.list <- list(list(),structure(
    list(
     experience = structure(
      list(
       start = "Hi" 
      ),.Names = c("start")), 
     `_meta` = structure(
      list(weight = 1L, `_sources` = list(structure(
       list(`_origin` = "a"), .Names = "_origin" 
      ))),.Names = c("weight", "_sources"))),.Names = c("experience", "_meta"))) 

my.list[[1]]$experience$start 
    NULL 
my.list[[2]]$experience$start 
    [1] "Hi" 


    df <- NULL 
    for(i in 1:2){df = rbind.fill(df, data.frame(id=i, 
data=if(is.null(my.list[[i]]$experience$start))             
    {NA}else{my.list[[i]]$experience$start}))} 

Тогда

df2 <- NULL 
for(i in 1:2){df2 = rbind.fill(df2, data.frame(id=i,            
data=if(is.null(my.list[[i]]$experience$start))              
{"NA"}else{my.list[[i]]$experience$start}))} 

Результаты:

df:    df2: 

id data  id data 
1 NA   1 NA 
2 1   2 HI 
+0

Каков ожидаемый результат для 'df'? Только одна строка с опытом начала id2 «Привет» или две строки? –

+0

обновлен с результатами - df1 ошибочен, и я хотел бы знать, почему – Olivia

ответ

1

Оливия, спасибо за разъяснения. Вы почти у цели. По мере того, как вы выполняете цикл, на самом деле первая итерация будет определять класс столбца data вашего выходного data.frame df.

В сценарии 1, вы можете иметь лучшее представление о том, перейдя через шаг петли за шагом:

df <- NULL 
i=1 
df = rbind.fill(df, data.frame(id=i, 
    data=if(is.null(my.list[[i]]]$experience$start)) {NA} 
    else{my.list[[i]]$experience$start})) 
df 

    id data 
1 1 NA 

Затем взгляните на класс df$data

class(df$data) 
[1] "logical" 

который является производным от : mode(NA) (логический).

Как альтернативный способ хранения данных, связанных с вашим набором экспериментов в списке, вы должны попытаться использовать «R-ish» способ управления этим списком.

Например, вы можете попробовать:

sapply(my.list, FUN=function(element)element$experience$start) 
[[1]] 
NULL 

[[2]] 
[1] "Hi" 

Что подчеркивает, что вы пытаетесь собрать наборы содержания несоединимых: упрощение не может идти проще, чем этот список - если вы unlist вы бы отклонить это значимое NULL

+0

Нулевые или NA требуются так, чтобы количество строк было правильным. Вот почему есть столбец идентификатора, основанный на i. Мои фактические данные более сложны, вытягивая из вложенных списков, которые исходят из json-ответа от api. Использование «0», похоже, работает. Ive не проверено и не видно, будет ли 0 работать, или будет ли числовой символ испортить символы, следующие – Olivia