如何理解在data.frame上使用gsub的输出

时间:2014-01-02 13:57:41

标签: r

您可以在data.frame上使用gsub吗?

dat="1   1W   16   2W   16
2    1   16   2W    W
3   1W   16   16    0
4    4   64   64    0"      
data=read.table(text=dat,header=F)
gsub("W",3,data)

为什么我们得到如下输出:

[1] "1:4"               "c(2, 1, 2, 3)"     "c(16, 16, 16, 64)" "c(2, 2, 1, 3)"     "c(2, 3, 1, 1)"   .

很难理解。

> str(data)
'data.frame':   4 obs. of  5 variables:
 $ V1: int  1 2 3 4
 $ V2: Factor w/ 3 levels "1","1W","4": 2 1 2 3
 $ V3: int  16 16 16 64
 $ V4: Factor w/ 3 levels "16","2W","64": 2 2 1 3
 $ V5: Factor w/ 3 levels "0","16","W": 2 3 1 1

V2: Factor w/ 3 levels "1","1W","4": 2 1 2 3中* 2 1 2 3 * 的含义是什么?

2 个答案:

答案 0 :(得分:2)

输出与as.character(data)相同。

由于字母W从未出现在任何字符串中,gsub除了转换为字符外无效。

正如评论中所讨论的,as.character在数据框架上有奇怪的行为。它调用as.vector(x, "character"),它需要将每列压缩为单个值,并选择返回重新创建列所需的代码,忽略属性。对于因子列,这意味着您获得整数级别,而不是字符串值,这就是W永远不会出现的原因。

答案 1 :(得分:0)

您需要apply遍历数据框中的每个值:

apply(data, 1:2, function(x) gsub("W", 3, x))
#      V1  V2   V3   V4   V5  
# [1,] "1" "13" "16" "23" "16"
# [2,] "2" "1"  "16" "23" "3" 
# [3,] "3" "13" "16" "16" "0" 
# [4,] "4" "4"  "64" "64" "0" 

@Richie Cotton的评论解释了为什么你需要这样做。