使用R

时间:2016-07-21 15:23:06

标签: r dataframe missing-data

我正在尝试使用readHtmlTable函数从网页导入表格,这是数据在R中时的前几行。

              Event                Athlete Country      Result  Medal year
1          100m Men              Tom Burke     USA        12.0   GOLD 1896
2                            Fritz Hofmann     DEU   12.2 est. SILVER 1896
3                             Francis Lane     USA        12.6 BRONZE 1896
4                          Alajos Szokolyi     HUN   12.6 est. BRONZE 1896
5          400m Men              Tom Burke     USA        54.2   GOLD 1896
6                          Herbert Jamison     USA         n/a SILVER 1896
7                           Charles Gmelin     GBR         n/a BRONZE 1896
8          800m Men            Teddy Flack     AUS      2:11.0   GOLD 1896
9                            Nֳ¡ndor Dֳ¡ni     HUN 2:11.8 est. SILVER 1896
10                       Demitrios Golemis     GRE         n/a BRONZE 1896

现在,如果您查看事件列,您可以看到事件字段的某些行为空,这就是表格在网站上的方式,我正在寻找的是填充这些空白的最有效方法最后它应该看起来像这样

              Event       Athlete      Country      Result  Medal year
1          100m Men       Tom Burke       USA        12.0   GOLD 1896
2          100m Men       Fritz Hofmann   DEU   12.2 est. SILVER 1896
3          100m Men       Francis Lane    USA        12.6 BRONZE 1896
4          100m Men       Alajos Szokolyi HUN   12.6 est. BRONZE 1896
5          400m Men       Tom Burke       USA        54.2   GOLD 1896

基本上每当Event列中的一个字段为空时,我需要用最后一个非空的值填充它。该列保存在R中作为一个因素,我知道技术上我可以使用for循环并遍历所有向量元素,但考虑到此表中有大约300000行的胖,这是非常耗时的。我希望有更高效的东西

3 个答案:

答案 0 :(得分:1)

以下是purrr软件包如何用于解决您的问题的玩具示例,假设数据位于data.frame且缺失值为NA:< / p>

library(purrr)

df <- data.frame("event" = c(1, NA, 2, NA, 3, NA, 5), "other" = 1:7)

df
#     event other
# 1     1     1
# 2    NA     2
# 3     2     3
# 4    NA     4
# 5     3     5
# 6    NA     6
# 7     5     7


df$event <- accumulate(.x = df$event, .f = function(x, y) { if(is.na(y)) x else y })

df
#     event other
# 1     1     1
# 2     1     2
# 3     2     3
# 4     2     4
# 5     3     5
# 6     3     6
# 7     5     7

答案 1 :(得分:1)

R Studio包fill中的tidyr函数旨在执行此类数据清理。我们会将其与mutate包中的dplyr一起使用,该NA包将首先用df替换缺失值。您的数据位于数据框library(dplyr) library(tidyr) df_fill <- df %>% mutate(Event = ifelse(Event == "", NA,Event)) %>% fill(Event) 代码中

q_changed

答案 2 :(得分:0)

以下是使用rleinverse.rle的基本R方法:

# create run length encoding
temp <- rle(df$event)
# fill in missing values with previous values
temp$values[is.na(temp$values)] <- temp$values[which(is.na(temp$values))-1]

# fill in vector of data.frame
df$event <- inverse.rle(temp)

请注意,如果变量的第一个位置缺少值,则不会起作用。