R之基本数据管理

创建新变量
算术运算符:

+                                          # 加
-                                          # 减
×                                          # 减
/                                          # 除
^或**                                      # 求幂
x%%y                                       # 求余
x%/%y                                      # 整除, 5%/%2=2

可以对数据框的列通过运算得到新的列

mydata <- data.frame(x1=c(1,2,3), x2=c(2,4,6))
mydata$sumx <- mydata$x1 + mydata$x2
mydata$meanx <- (mydata$1 + mydata$2) / 2

变量重编码
例如,需要将连续型变量修改为类别值;将误编码值替换为正确值。
逻辑运算符:

<                                                   # 小于
<=                                                  # 小于等于
>                                                   # 大于
>=                                                  # 小于等于
==                                                  # 等于
!=                                                  # 不等于
!x                                                  # 非x
x|y                                                 # x或y
x&y                                                 # x且y
isTRUE(x)                                           # x是否为TRUE

举例,连续型变量age编码为(Young, Middle, Old)

mydate$agecat[mydata$age > 60] <- "Old"
mydate$agecat[mydata$age <= 60 & mydata$age >30] <- "Middle"
mydata$agecat[mydata$age <= 30] <- "Young"
# 更紧凑的写法
mydata <- within(mydata, {
agecat<-NA,
agecat[age>60] <- "Old",
agecat[age<=60 & age>30] <- "Middle",
agecat[age<=30] <- "Young"
})

变量重命名
如果对现有变量名不满意,可以使用fix()以交互式方式在弹出的对话框中修改变量名

fix(leadership)

或者,使用reshape包中的rename函数

rename(dataframe, c(oldname1="newname1", oldname2="newname2", ...))
# 示例
library(reshape)
leadership <- rename(leadership, c(manager="managerID"))

或者通过names()来重命名

names(leadership)[1] <- "managerID"

缺失值
在R中,缺失值以NA表示,不可能出现的值以NaN表示。可以使用is.na()判断是否为缺失值。

y <- c(1,2,3,NA)
is.na(y)
> FALSE FALSE FALSE TRUE

分析时,通过na.rm=TRUE来排除缺失值,na.omit()移除所有的包含缺失值的行。

sumy <- sum(y, na.rm=TRUE)
newdata <- na.omit(newdata)

日期值
日期值通常以字符串的形式输入R中,然后转为数值型的日期变量,as.Date(x, "input_format")。

%d                   #日期,01-31
%m                   #月份00-12
%y                   #两位数的年份
%Y                   #完整的年份
%a                   #缩写的星期名,Mon
%A                   #非缩写的星期名,Monday
%b                   #缩写的月份,Jan
%B                   #非缩写的月份,January

日期的默认格式为yyyy-mm-dd

mydates <- as.Date(c("2017-01-01","2017-07-03")) #默认格式
dates <- as.Date("01/05/93", "%m/%d/%y")

Sys.Date()返回当天日期,date()返回当前日期和时间
可以通过format()将日期以指定形式打印。

today <- Sys.Date()
format(today, "%B %d %Y")

日期可以执行算术运算,例如相减得到相隔的天数。difftime()则可以按星期、天、时、分、秒来表示相隔的时间。

today <- Sys.Date()
birthday <- as.Date("2010-01-01")
difftime(today, birthday, units="weeks")

日期转为字符型变量:strDates <- as.character(dates)
类型转换

类型判断                                            类型转换
is.numeric()                                      as.numeric()
is.character()                                    as.character()
is.vector()
is.matrix()
is.data.frame()
is.factor()
is.logical()

数据排序
可以使用order()对一个数据框进行排序,默认为升序,在排序变量前加减号则可得降序

newdata <- leadership[order(leadership$age), ]
# or
attach(leadership)
newdata <- leadership[order(gender, -age), ]
detach(leadership)

数据集合并
列合并,可以通过merge()通过一个或多个共有变量进行联结。

total <- merge(dataframeA, dataframeB, by="ID")
total <- merge(dataframeA, dataframeB, by=c("ID","Country"))

直接合并列的话,可以使用cbind():total <- cbind(A, B),但需保证行数相同。
行合并,使用rbind():total <- rbind(A, B),但需要保证数据框拥有相同变量,如不满足可以先进行预处理,将未有变量设置为NA。
数据集取子集
选取列子集

newdata <- leadership[, c(6:10)] # 取6-10列
# 通过列名选择变量
myvar <- c("q1", "q2")
newdata <- leadership[myvar]

删除部分列

myvar <- names(leadership) %in% c("q3", "q4")
# 上面可以生成一个logical向量
newdata <- leadership[!myvar]

选取行子集

# 选择1-3行
newdata <- leadership[1:3, ]
# 选择满足某些条件的行
newdata <- leadership[which(leadership$gender=="M" & leadership$age > 30), ]

其中,which()给出了向量中值为TRUE的下标,例如which(c(TRUE, TRUE, FALSE))为c(1, 2)
综合,可以使用subset函数选取满足条件的行及部分列。

newdata <- subset(leadership, age>=35|age<24, select=c(q1, q2, q3))

随机抽样,使用sample()函数产生所需样本数的随机行号

# 随机抽取大小为3的样本
mysample <- mydata[sample(1:nrow(mydata), 3, replace=FALSE), ]
# 参数replace表示无放回抽样

SQL语句,通过sql语句对数据框完成子集选取

library(sqldf)
newdf <- sqldf("select * from mtcars where carb=1 order b y mpg", row.names=TRUE)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 198,932评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,554评论 2 375
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 145,894评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,442评论 1 268
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,347评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,899评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,325评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,980评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,196评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,163评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,085评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,826评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,389评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,501评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,753评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,171评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,616评论 2 339

推荐阅读更多精彩内容