R in Context

2020-04-01

The variety of R syntaxes give you many ways to “say” the same thing.

R语言存在多种Syntax,最为常用的是base R (dollar sign), tidyverse和formula syntax,实际使用中经常出现不同Syntax混用的情况,对学习造成了一定困扰。因此除了应用场景,我也会注意Syntax的使用。


Dataframe

数据

查询和提取

  1. datafram和tibble在提取列的时后使用tt[,'age']有区别(不兼容,应避免使用)。这些语法也可以推广到list
data.frame tibble list
tt$age vector vector list
tt['age'] data.frame 1 column tibble 1 column list
tt[,'age'] vector tibble 1 column 无效
tt[['age']] vector vector vector
  1. datafram和tibble在使用逻辑下标时,datafram可以使用matrix,而tibble则会抛错,相比之下tibble的语法更统一了
data.frame tibble
tt[tt$age>15,] OK OK
tt[tt['age']>15] OK NO
tt[tt['age']>15,] OK OK
tt[tt[,'age']>15,] OK OK
tt[tt[['age']]>15,] Ok OK
tt[which(tt$age>15),] OK OK

参考资料7 R向量下标和子集

聚合

  1. 窗口函数的使用:累计降水和累计均值

巧用R语言中各类聚合窗口函数

1
2
3
4
5
prcp <- prcp %>% group_by(COUNTRY_NAME) %>% 
mutate(
CMEAN_PRCP = order_by(YEAR, cummean(AVG_PRCP)),
CSUM_PRCP = order_by(YEAR, cumsum(AVG_PRCP))
)

更新值

  1. 更新一列中部分值
1
prcp$COUNTRY_NAME[prcp$COUNTRY_NAME=="Bahamas, The"] <- "Bahamas"

变量

类型

变量转换

  1. 将shiny widget的input变量作为对象(值或是字符串代表的对象)
1
2
3
4
5

# 第一个widget,选择项的值是字符串,但后续要用做dataframe的列名
radioButtons("cmethod", label=("Choose a method"), choices = list("Cumulative Average" = "CMEAN_PRCP", "Cumulative Sum" = "CSUM_PRCP"), selected = "CMEAN_PRCP")
# 第二个widget,slider选择的是年份,值是整数
sliderInput("syear", label = ("Years Range"), min = 1764, max = 2020, value = c(1764,2020))
1
2
3
4
5
6
7
8
9
10
# Server中的funciton
prcp_year <- prcp %>%
filter(YEAR>=input$syear[1],YEAR<=input$syear[2]) %>% # 直接使用widget传入的值
group_by(COUNTRY_NAME) %>%
mutate(
LAST_PRCP = last(
eval(parse(text = input$cmethod)), # 不能直接使用widget传入的值,需要首先使用parse函数将字符串转化为表达式(expression),而后使用eval()函数对表达式求解
order_by = YEAR)
) %>%
select(COUNTRY_NAME, LAST_PRCP) %>% distinct()

以下两篇文章解释的更全面,eval(parse(text = ))的方来来自于第二篇

变量名称和字符串的转换

如何将字符串转变为命令􏰉行?

Tags: R

扫描二维码,分享此文章