Это зависит от порядка, в котором выполняются строки.Мы можем использовать приведенный ниже код для определения класса элементов в столбцах
class(df$missingA[[1]]) # Class of first element is numeric
class(df$missingB[[1]]) # Class of first element is list
Начиная с чистого набора данных, если вы сначала создадите отсутствующий B, а затем создаете отсутствующий A, вы увидите, что отсутствующий A будетсписок списков, тогда как missingB будет списком чисел (типы поменялись местами).
df$missingB <- apply(df,1,function(x)
setdiff(
x[which(
grepl("b",names(x),fixed = TRUE) &
grepl("fill",names(x),fixed = TRUE))
],
x[which(
grepl("b",names(x),fixed = TRUE) &
!grepl("fill",names(x),fixed = TRUE))
]
)
)
df$missingA <- apply(df,1,function(x)
setdiff(
x[which(
grepl("a",names(x),fixed = TRUE) &
grepl("fill",names(x),fixed = TRUE))
],
x[which(
grepl("a",names(x),fixed = TRUE) &
!grepl("fill",names(x),fixed = TRUE))
]
)
)
class(df$missingA[[1]]) # Class of first element is list
class(df$missingB[[1]]) # Class of first element is numeric
Я предполагаю, что происходит следующее.Вы начинаете с кадра данных, содержащего только числовые столбцы.R пытается помочь, сопоставляя тип вашего списка с числовым.Когда второй столбец добавляется, информационный фрейм больше не состоит только из числовых столбцов, поскольку один из типов теперь является списком, и поэтому R не пытается обновить тип.
Чтобы проверить это, вы можете добавитьнет числового столбца перед добавлением отсутствующих A и отсутствующих B, например:
df$text <- list("a","b","C")
Теперь пропущенные и отсутствующие B будут созданы как список списка
Еще один способ сохранить типы в том виде, как они создаютсяоператоры apply - это присвоение выходных данных промежуточной переменной
missingA <- apply(df,1,function(x)
setdiff(
x[which(
grepl("a",names(x),fixed = TRUE) &
grepl("fill",names(x),fixed = TRUE))
],
x[which(
grepl("a",names(x),fixed = TRUE) &
!grepl("fill",names(x),fixed = TRUE))
]
)
)
df$missingA <- missingA
Подводя итог, можно заметить, что разница не в вызванных операторах применения или выходных данных, а в том, как данные добавляются вкадр данных.Надеюсь, это поможет!