分享

R语言学习----数据缺失值,表整理

 杉杉之园 2018-07-11
请选中你要保存的内容,粘贴到此文本框

tidyr包主要涉及:
1)缺失值的简单补齐
2)长形表变宽形表与宽形表变长形表
3)列分割与列合并

1.缺失值的简单补齐
library(tidyr)
library(dplyr)

# 创建含有缺失值的数据框示例
x <- c(1,2,7,8,NA,10,22,NA,15)
y <- c("a",NA,"b",NA,"b","a","a","b","a")
df <- data.frame(x = x,y = y)
df
  • 1

下面用x的均值或中位数替换缺失值,用y的众数替换缺失值。

#计算x的均值和中位数(对缺失值比较敏感)
x_mean <- mean(df$x, na.rm = TRUE)
x_median <- median(df$x, na.rm = TRUE)
#计算y的众数
y_mode <- as.character(df$y[which.max(table(df$y))])

a <- which.max(table(df$y)) #整数型变量,即列表元素个数最多的位置
a1 <- df$y[which.max(table(df$y))] #因子型变量(具体可见table()求每个因子水平的频数)

#替换数据框df中x和y的缺失值
df2 <- replace_na(data = df, replace = list(x = x_mean, y = y_mode))
df2j
  • 1

2.长形表变宽形表与宽形表变长形表
这里简单介绍一下何为长形表和宽形表,简单的说,长形表就是一个观测对象可由多行组成,而宽形表则是一个观测仅由一行组成。例如:

#长形表
name <- c('A','A','A','B','B')
product <- c('P1','P2','P3','P1','P4')
price <- c(100,130,55,100,78)
df_long <- data.frame(name = name, product = product, price = price)
df_long

#宽形表
name <- c('A','B','C')
gender <- c('f','f','m')
province <- c('JS','SH','HN')
age <- c(18,22,19)
df_wide <- data.frame(name = name, gender = gender, province = province, age = age)
df_wide
  • 1

有时,为了满足建模或绘图的要求,往往需要将长形表转换为宽形表,或将宽形表变为长形表。如何实现这两种数据表类型的转换。
使用spread()函数实现长表转宽表,语法如下:
spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE)
data:为需要转换的长形表
key:需要将变量值拓展为字段的变量
value:需要分散的值
fill:对于缺失值,可将fill的值赋值给被转型后的缺失值

df_long_expand <- spread(data = df_long, key = product, 
                          value = price)
df_long_expand

 被转型后的数据框中存在缺失值,如果想给缺失值传递一个指定值的话,就需要fill参数的作用。
df_long_expand2 <- spread(data = df_long, key = product, 
                          value = price, fill = 0)
df_long_expand2
  • 1

使用gather()函数实现宽表转长表,语法如下:
gather(data, key, value, …, na.rm = FALSE, convert = FALSE)
data:需要被转换的宽形表
key:将原数据框中的所有列赋给一个新变量key
value:将原数据框中的所有值赋给一个新变量value
…:可以指定哪些列聚到同一列中
na.rm:是否删除缺失值

示例:

#默认将所有列存放到key中
df_wide_gather <- gather(data = df_wide, key = variable,
                         value = value)
df_wide_gather

#指定需要被聚为一列的字段
df_wide_gather2 <- gather(data = df_wide, key = variable, 
                          value = value, gender, province)
df_wide_gather2

#df_wide_gather2的结果也可以写成
df_wide_gather3 <- gather(data = df_wide, key = variable, 
                          value = value, -name) #除name外,其他变量聚成一列
df_wide_gather3
  • 1

我所理解的,宽表变长表,即把某几列合成一列,给一个新的变量名称。

3.列分割与列合并
separate()函数可将一列拆分为多列,一般可用于日志数据或日期时间型数据的拆分,语法如下:
separate(data, col, into, sep = “[^[:alnum:]]+”, remove = TRUE,
convert = FALSE, extra = “warn”, fill = “warn”, …)
data:为数据框
col:需要被拆分的列
into:新建的列名,为字符串向量
sep:被拆分列的分隔符
remove:是否删除被分割的列
示例:

id <- c(1,2)
datetime <- c(as.POSIXlt('2015-12-31 13:23:44'), as.POSIXlt('2016-01-28 21:14:12'))
df <- data.frame(id = id, datetime = datetime)
df
  • 1

下面使用separate()函数将日期时间值分割为年、月、日、时、分、秒

# 将日期时间数据切割为日期和时间两列
separate1 <- df%>%separate(.,col = datetime,into = c("data","time"),
                           sep = " ",remove = FALSE)
separate1

# 将日期切割为年月日
separate2 <- separate1 %>% separate(col = data,into = c("year","month","day"),
                                    sep = "-",remove = FALSE)
separate2


# 将时间切割为时分秒
separate3 <- separate2 %>% separate(col = time,into = c("hour","minute","second"),
                                    sep = ":",remove = FALSE)
separate3
  • 1

unite()函数与separate()函数相反,可将多列合并为一列,语法如下:
unite(data, col, …, sep = “_”, remove = TRUE)
data:为数据框
col:被组合的新列名称
…:指定哪些列需要被组合
sep:组合列之间的连接符,默认为下划线
remove:是否删除被组合的列

#删除原来的日期时间列、日期列和时间列
separate3 <- separate3[, -c(2,3,7)]
separate3 

#将年月日合并为新字段日期
unite1 <- unite(data = separate3, 'date', sep = '-', year, month, day)
unite1

#将时分秒合并为新字段时间
unite2 <- unite1 %>% unite(., col = 'time', sep = ':', hour, minute, second)
unite2
  • 1

在数据预处理过程中,可以灵活运用data.table包、reshape包、reshape2包、plyr包、dplyr包和tidyr包。这些包都源于ggplot2包的作者Hardly,通过运用这些包的组合函数,可以迅速提高数据预处理的效率。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多