Различие между двумя списками (например, list1 и list2) можно найти, используя следующую простую функцию.
def diff(list1, list2):
c = set(list1).union(set(list2)) # or c = set(list1) | set(list2)
d = set(list1).intersection(set(list2)) # or d = set(list1) & set(list2)
return list(c - d)
или
def diff(list1, list2):
return list(set(list1).symmetric_difference(set(list2))) # or return list(set(list1) ^ set(list2))
Используя эту функцию, разницу можно найти с помощью diff(temp2, temp1)
или diff(temp1, temp2)
. Оба дадут результат ['Four', 'Three']
. Вам не нужно беспокоиться о порядке списка или списке, который должен быть указан первым.
Вы можете сделать:
x[, 1:2][is.na(x[, 1:2])] <- 0
или лучше (IMHO), используйте имена переменных:
x[c("a", "b")][is.na(x[c("a", "b")])] <- 0
В обоих случаях 1:2
или c("a", "b")
могут заменить на заранее определенный вектор.
Не уверен, что это более красноречиво, но эта функция также найдет и позволит заменить NA (или любое значение, которое вам нравится) в выбранных столбцах data.table:
update.mat <- function(dt, cols, criteria) {
require(data.table)
x <- as.data.frame(which(criteria==TRUE, arr.ind = TRUE))
y <- as.matrix(subset(x, x$col %in% which((names(dt) %in% cols), arr.ind = TRUE)))
y
}
it:
y[update.mat(y, c("a", "b"), is.na(y))] <- 0
Функция создает матрицу из выбранных столбцов и строк (координаты ячеек), которые соответствуют входным критериям (в этом случае is.na == TRUE).
Это будет работать для вашей версии data.table
:
for (col in c("a", "b")) y[is.na(get(col)), (col) := 0]
В качестве альтернативы, как указывает Давид Аренбург, вы можете использовать set
(боковое преимущество - вы можете использовать его либо на data.frame
] или data.table
):
for (col in 1:2) set(x, which(is.na(x[[col]])), col, 0)
y[ , (cols) := lapply(.SD, function(x){out <- x; out[is.na(out)] <- 0; out}), .SDcols = cols]
"пропускает" цикл, но довольно уродливый ИМО. Просто упоминание, поскольку оно, по меньшей мере, соответствует «парадигме». из lapply
/ .SDcols
обновлений для data.table
. Я думаю, мы могли бы также написать na.to.0<-function(x){x[is.na(x)]<-0; x}
, затем сделать y[ , (cols) := lapply(.SD, na.to.0), .SDcols = cols]
...
– MichaelChirico
29 January 2016 в 20:03
это отлично работает для меня
DataTable DT = new DataTable();
DT = DT.AsEnumerable().Select(R =>
{
R["Campo1"] = valor;
return (R);
}).ToArray().CopyToDataTable();
Для конкретного столбца существует альтернатива с sapply
DF <- data.frame(A = letters[1:5],
B = letters[6:10],
C = c(2, 5, NA, 8, NA))
DF_NEW <- sapply(seq(1, nrow(DF)),
function(i) ifelse(is.na(DF[i,3]) ==
TRUE,
0,
DF[i,3]))
DF[,3] <- DF_NEW
DF
Теперь это тривиально в tidyr с replace_na (). Функция, как представляется, работает для data.tables, а также data.frames:
tidyr::replace_na(x, list(a=0, b=0))
x[, 1:2][x[, 1:2] == 1] <- 0
– flodel 15 October 2013 в 12:08x
принимает матрицу как ее первый член только при выполнении назначения? Описанная здесь функция? Также я думаю, что вы забыли поставить запятую перед векторами с именами столбцов в вашем втором примере. – ChiseledAbs 9 December 2016 в 03:35[
, он будет извлекать указанные столбцы (см. stackoverflow.com/a/21137524/1201032 ). Я надеюсь, что это ответит на ваш вопрос, но в будущем, пожалуйста, избегайте комментирования очень старых ответов, подобных этому; вместо этого задайте новый вопрос. – flodel 10 December 2016 в 00:38In both cases, 1:2 or c("a", "b") can be replaced by a pre-defined vector.
Когда я использовал предопределенный вектор, подобный этомуx[Vpredefined][is.na(x[Vpredefined])] <- 0
, он дает мне ошибку – Rohit Saluja 28 February 2018 в 13:37