Замените элементы вектора символов в кадре данных значениями в R

У меня есть фрейм данных с множеством столбцов символов. Столбцы содержат пустые текстовые строки и текстовые строки. Я хотел бы заменить все пустые текстовые строки внутри фрейма данных на 0 и элементы, содержащие строки с номером 1. Не могу понять, как это сделать, хотя....

простой пример для иллюстрации:

> df
       A   B  C
1: asdad       
2:           sd
3:    as  sd sd
4: daasd  sd   
5:        sd   
6:           sd
7:    ds sds   
8:   asd       
9:        sd sd

> str(df)
Classes ‘data.table’ and 'data.frame':  9 obs. of  3 variables:
 $ A: chr  "asdad" "" "as" "daasd" ...
 $ B: chr  "" "" "sd" "sd" ...
 $ C: chr  "" "sd" "sd" "" ...
 - attr(*, ".internal.selfref")=<externalptr> 

хотел :

> df
   A B C
1: 1 0 0
2: 0 0 1
3: 1 1 1
4: 1 1 0
5: 0 1 0
6: 0 0 1
7: 1 1 0
8: 1 0 0
9: 0 1 1

str(df)
Classes ‘data.table’ and 'data.frame':  9 obs. of  3 variables:
 $ A: int  1 0 1 1 0 0 1 1 0
 $ B: int  0 0 1 1 1 0 1 0 1
 $ C: int  0 1 1 0 0 1 0 0 1
 - attr(*, ".internal.selfref")=<externalptr> 

person jonas    schedule 17.12.2014    source источник


Ответы (1)


Вот простое векторизованное решение

(df != "") + 0
#    A B C
# 1: 1 0 0
# 2: 0 0 1
# 3: 1 1 1
# 4: 1 1 0
# 5: 0 1 0
# 6: 0 0 1
# 7: 0 1 1
# 8: 1 0 0
# 9: 0 1 1

Если у вас есть объект data.table, добавьте as.data.table, как в

as.data.table((df != "") + 0)

Некоторые пояснения

Когда вы выполняете df != "", R в основном сравнивает каждое значение в df с "" (пусто) и возвращает логическую матрицу с TRUE и FALSE, указывающими для каждого значения, равно ли оно "" или нет. при добавлении + 0 логические значения преобразуются в 1 и 0.


Изменить:

Если у вас есть объект data.table и вы хотите обновить его по ссылке, вы можете сделать

df[, names(df) := lapply(.SD, function(x) (!x %in% c("", " ")) + 0)]
person David Arenburg    schedule 17.12.2014
comment
отлично работал на примере, но не на моем исходном наборе данных. Много 1 там, где их быть не должно. Хм, может быть, в наборе данных есть пробелы или что-то в этом роде. Любые идеи по исправлению этого - person jonas; 18.12.2014
comment
Ну, я не могу сказать без реальных данных, извините. - person David Arenburg; 18.12.2014
comment
Пытался просмотреть его подмножество в Excel, и в наборе данных были пробелы.. любые советы - person jonas; 18.12.2014
comment
Может ((df != "") & (df != " ")) + 0? - person David Arenburg; 18.12.2014
comment
Отлично, спасибо!! Вот и все, я должен научиться этому фокусу, любые советы - person jonas; 18.12.2014
comment
Магии на самом деле нет. Добавлены пояснения к ответу. Попробуйте просто запустить df != "" и посмотрите, что получится. - person David Arenburg; 18.12.2014
comment
Смотрите мое редактирование, я добавил возможность обновления по ссылке, если у вас есть объект data.table. Это может быть удобнее для вас - person David Arenburg; 18.12.2014