将数据框中的字符向量元素替换为R中的值

时间:2014-12-17 21:15:45

标签: r string replace

我有一个包含许多字符列的数据框。列包含空文本字符串和文本字符串。我想用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> 

1 个答案:

答案 0 :(得分:2)

这是一个简单的矢量化解决方案

(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中的每个值与""(空白)进行比较,并返回一个包含TRUEFALSE的逻辑矩阵如果每个值等于"",则指示每个值。添加+ 0后,逻辑值将转换为10


修改

如果你有一个data.table对象,你想通过引用更新它,你可以做

df[, names(df) := lapply(.SD, function(x) (!x %in% c("", " ")) + 0)]