Замена значения на NA во всех столбцах, кроме определенного набора [duplicate]

Различие между двумя списками (например, 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']. Вам не нужно беспокоиться о порядке списка или списке, который должен быть указан первым.

Ссылка на python doc

60
задан Jilber Urbina 15 October 2013 в 11:40
поделиться

6 ответов

Вы можете сделать:

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") могут заменить на заранее определенный вектор.

79
ответ дан flodel 22 August 2018 в 07:10
поделиться
  • 1
    Это делает работу. А если я хочу найти «1»? Я попытался изменить его, но я не мог заставить его работать. – jnam27 15 October 2013 в 12:07
  • 2
    Вероятно, вот так: x[, 1:2][x[, 1:2] == 1] <- 0 – flodel 15 October 2013 в 12:08
  • 3
    @flodel, почему datatable x принимает матрицу как ее первый член только при выполнении назначения? Описанная здесь функция? Также я думаю, что вы забыли поставить запятую перед векторами с именами столбцов в вашем втором примере. – ChiseledAbs 9 December 2016 в 03:35
  • 4
    @ChiseledAbs, я думаю, вы имеете в виду индексацию матриц (см. Это, например, stackoverflow.com/a/13999583/1201032 ), но это не ограничивается назначением, оно также может использоваться для извлечения данных , Что касается недостающей запятой: нет. Data.frames - это списки столбцов, поэтому, если вы используете один аргумент в [, он будет извлекать указанные столбцы (см. stackoverflow.com/a/21137524/1201032 ). Я надеюсь, что это ответит на ваш вопрос, но в будущем, пожалуйста, избегайте комментирования очень старых ответов, подобных этому; вместо этого задайте новый вопрос. – flodel 10 December 2016 в 00:38
  • 5
    In 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

Не уверен, что это более красноречиво, но эта функция также найдет и позволит заменить 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).

0
ответ дан Amy M 22 August 2018 в 07:10
поделиться

Это будет работать для вашей версии 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)
19
ответ дан eddi 22 August 2018 в 07:10
поделиться
  • 1
    Спасибо за это. Просто хотел знать, 3 года спустя, если есть способы сделать это без петли? Думаю, это было бы более сжато командой data.table? Благодарю. – info_seekeR 14 January 2016 в 14:18
  • 2
    @info_seekeR Я не знаю более кратким способом – eddi 14 January 2016 в 16:43
  • 3
    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();
-2
ответ дан Juanico Lasa 22 August 2018 в 07:10
поделиться

Для конкретного столбца существует альтернатива с 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
0
ответ дан Rafa 22 August 2018 в 07:10
поделиться

Теперь это тривиально в tidyr с replace_na (). Функция, как представляется, работает для data.tables, а также data.frames:

tidyr::replace_na(x, list(a=0, b=0))
8
ответ дан Robert McDonald 22 August 2018 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: