使用sub()时数据框丢失格式

时间:2014-05-01 02:15:06

标签: r dataframe

我有一个看起来有点像这样的数据框:

   ID          Hero Win Rate Matches Played KDA Ratio Wraith King Abaddon   Lich  Lycan Centaur Warrunner   Zeus Necrophos Death Prophet
27          Slardar   52.32%      2,741,067      2.42      -0.63%  -2.16% -3.01%  2.40%            -0.75% -3.29%    -1.93%        -1.83%
50             Doom   49.10%      3,202,905      2.50      -3.57%   1.72% -0.74% -3.12%             0.03% -1.76%    -0.88%        -2.62%
78    Bounty Hunter   45.29%      4,146,758      2.17      -1.56%  -2.67% -1.43%  0.51%            -2.17% -3.33%    -2.19%         0.63%
92             Chen   44.34%        546,677      1.72      -0.27%  -0.51% -1.35% -0.81%            -0.24% -0.33%     0.03%        -1.33%

我似乎可以指定例如执行此操作的第一行到新的data.frame:

newdataframe <- data.frame(Hero=subsetheroes[1,2],subsetheroes[1,6:ncol(subsetheroes)],stringsAsFactors = FALSE)

其中subsetheroes是旧的data.frame。它有效:

Hero Wraith.King Abaddon   Lich Lycan Centaur.Warrunner   Zeus Necrophos Death.Prophet Terrorblade Vengeful.Spirit Omniknight
27 Slardar      -0.63%  -2.16% -3.01% 2.40%            -0.75% -3.29%    -1.93%        -1.83%      -1.35%          -1.65%     -1.79%

但是,我想将其中包含百分比的行转换为原始数字,并将它们分配给新的数据框。我认为这样可行:

totals <- data.frame(Hero=subsetheroes[1,2],as.numeric(sub("%", "", subsetheroes[1,6:ncol(subsetheroes)])),stringsAsFactors = FALSE)

不幸的是,输出结果如下:

       Hero as.numeric.sub..........subsetheroes.1..6.ncol.subsetheroes....
1   Slardar                                                           -0.63
2   Slardar                                                           -2.16
3   Slardar                                                           -3.01
4   Slardar                                                            2.40

数字转换得很漂亮,但它会使每个条目成为新行,并重复第1列。

为什么通过添加as.number()和sub()函数会表现得如此奇怪?

编辑:我已经把代码放在这里生成表:http://pastebin.com/rRKYxawV - subsetheroes表只是使用subset()函数从heroestable中的几行。

1 个答案:

答案 0 :(得分:1)

试试这个:

x <- subsetheroes[,c(2,6:ncol(subsetheroes))]
x[,2:ncol(x)] <- lapply(x[,2:ncol(x)],function(x) as.numeric(gsub(pattern="%","",x,fixed = TRUE)))

抓住所有东西,而不仅仅是一排,但你明白了。跳过尝试使用data.frame。只需子集,然后单独进行替换和转换。