【问题标题】:Data frame loses formatting on using sub()使用 sub() 时数据框丢失格式
【发布时间】:2014-05-01 10:51:27
【问题描述】:

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

   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 - 子集英雄表与使用子集()函数的 herostable 只是几行。

【问题讨论】:

  • 我将向您展示一种更简单的方法来执行此操作,但是读取您的示例数据是一件非常痛苦的事情,因为您只显示了 head 的输出并且您很傻包含空格的列名。所以我所能做的就是建议你阅读?data.frame 的价值部分的第二段,以解释为什么这根本不是奇怪的行为。它的行为与记录完全相同。
  • 我有奇怪标题的原因是因为我在dotabuff.com/heroes/slardar/matchups 上使用了 readHTMLTable() - 我没有命名列名......但是如果我有办法制作它们单字然后我很高兴...
  • 只需提供dput(head(...)) 的输出即可。
  • 嗨,乔兰,这是个好主意。确实,dput(head(subsetheroes)) 效果很好,但sub("%", "", dput(head(subsetheroes))) 似乎又完全改变了格式,即使 DPUT 只输出 ASCII 并且我正在 sub()ing:[1] "c(\"\", \"\", \"\", \"\")" "c(\"Slardar\", \"Doom\", \"Bounty Hunter\", \"Chen\")" [3] "c(\"52.32\", \"49.10%\", \"45.29%\", \"44.34%\")" "c(\"2,741,067\", \"3,202,905\", \"4,146,758\", \"546,677\")"
  • 不,你误解了我的意思。为了让人们有效地回答问题,我们需要使用示例数据。通常,可以将您的示例数据复制+粘贴到read.table(text = "") 中,然后使用它,但由于列名愚蠢,这不起作用。在您的问题中提供来自 dput 的输出,可以为那些试图帮助您的人提供一些他们自己可以轻松读入 R 并与之合作的东西。

标签: r dataframe


【解决方案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。只需子集,然后分别进行替换和转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多