R语言--变量与数据结构

R语言的数据分类

R语言的数据类型较多,但都是动态声明,即变量不会声明为某种数据类型。变量分配为R对象

  • 向量
  • 列表
  • 矩阵
  • 数组
  • 数据帧
  • 因子
    下面是几种最简单对象的类型
# Atomic vector of type character.
print("abc");#character

# Atomic vector of type double.
print(12.5)#numeric

# Atomic vector of type integer.
print(63L)#integer

# Atomic vector of type logical.
print(TRUE)#logical

# Atomic vector of type complex.
print(2+3i)#complex

# Atomic vector of type raw.
print(charToRaw('hello'))#raw

向量vector

最简单的是向量类型,即使用c()的形式声明。
以下示例中,如果其中一个元素是字符,则非字符值被强制转换为字符类型

# The logical and numeric values are converted to characters.
s <- c('apple','red',5,TRUE)
print(s)

实际上,向量的多元素可以用冒号表示,比如

v <- 6.6:12.6
print(v)
w <- 3.8:11.4

即表示从6.6到12.6,逐次加一构成的向量;w表示从3.8逐次加一到10.8。还可以用函数创建:

# Create vector with elements from 5 to 9 incrementing by 0.4.
print(seq(5, 9, by = 0.4))

如果其中一个元素是字符,则非字符值被强制转换为字符类型。

# The logical and numeric values are converted to characters.
s <- c('apple','red',5,TRUE)
print(s)

访问向量元素时,可以用'[ ]'填入适当条件作为索引。并且,向量支持数值运算,但必须是相同大小的。

列表list

创建列表用list函数,并且其中可以包含几乎任何数据类型,可以给list中的每个元素命名。

# Create a list containing a vector, a matrix and a list.
list_data <- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2), list("green",12.3))

# Give names to the elements in the list.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

# Show the list.
print(list_data)

列表访问

访问列表元素既可以用序号直接索引,也可以用名称索引

# Access the first element of the list.
print(list_data[1])

# Access the list element using the name of the element.
print(list_data$A_Matrix)

列表操作

操纵列表元素时,直接进行赋值操作。另外可以通过merged.list <- c(list1,list2)合并列表。

# Convert the lists to vectors.
v1 <- unlist(list1)
v2 <- unlist(list2)

矩阵matrix

在R语言中创建矩阵的基本语法是

matrix(data, nrow, ncol, byrow, dimnames)
  • 数据是成为矩阵的数据元素的输入向量。
  • nrow是要创建的行数。
  • ncol是要创建的列数。
  • byrow是一个逻辑线索。 如果为TRUE,则输入向量元素按行排列。
  • dimname是分配给行和列的名称。

矩阵访问元素

访问矩阵的元素直接用中括号填入矩阵下标访问,即a_{23}=M[2,3]。或者用单一下标直接访问整行或整列,即a_{13},a_{23},\cdots,a_{m3}=M[,3]

矩阵计算

使用R运算符对矩阵执行各种数学运算。 操作的结果也是一个矩阵。对于操作中涉及的矩阵,维度(行数和列数)应该相同。

数组

数组是可以在两个以上维度中存储数据的R数据对象。下面的例子实际上进行创建数组,以及数组命名的步骤:

# Create two vectors of different lengths.
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")

# Take these vectors as input to the array.
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names, matrix.names))
print(result)

同样的,数组的访问类似于矩阵,以上数组有三个维度,访问时用中括号以及两个逗号可以提取一个,或多个元素

print(array[1,3,4])
print(array[3, ,2])
print(array[2, , ])

操作数组的元素通过访问数组的部分元素来执行。比如可以用两个逗号和一个维度的数字,来提取出矩阵。
我们可以使用apply()函数在数组中的元素上进行计算。

apply(x, margin, fun)
  • x是一个数组。
  • margin是所使用的数据集的名称。
  • fun是要应用于数组元素的函数
    从而进行数组内部的运算

因子

在R语言中,名义变量和有序变量可以使用因子来表示。语法格式为

f <- factor(x=charactor(), levels, labels=levels, exclude = NA, ordered = is.ordered(x), namax = NA)
  • levels:因子数据的水平,默认是x中不重复的值;
  • labels:标识某水平的名称,与水平一一对应,以方便识别,默认取levels的值;
  • exclude:从x中剔除的水平值,默认为NA值;
  • ordered:逻辑值,因子水平是否有顺序(编码次序),若有取TRUE,否则取FALSE;
  • nmax:水平个数的限制。
    gl()函数用于定义有规律的因子向量,其语法格式如下
gl(n, k, length = n*k, labels = 1:n, ordered = FALSE)
  • n: 正整数,表示因子的水平个数
  • k:正整数,表示每个水平重复的次数;
  • length: 正整数,表示因子向量的长度,默认为n*k
  • labels: 表示因子水平的名称,默认值为1:n
  • ordered: 逻辑变量,表示因子水平是否是有次序的,默认值为FALSE
    并且factor()函数可以把向量data转化为factor。简单来说,因子就是一段具有二元层级顺序的有限序列,print打印出的是其level层级。数据帧(data.frame)中的每一列也可看做因子。
v <- gl(3, 4, labels = c("Tampa", "Seattle","Boston"))
print(v)
# 结果为
Tampa   Tampa   Tampa   Tampa   Seattle Seattle Seattle Seattle Boston 
[10] Boston  Boston  Boston 
Levels: Tampa Seattle Boston

数据帧

创建数据帧

# Create data frame
new.address <- data.frame(
   city = c("Lowry", "Charlotte"),
   state = c("CO", "FL"),
   zipcode = c("80230", "33949"),
   stringsAsFactors = FALSE
)

并且通过str()函数可以看到数据帧的结构。可以通过应用summary()函数获取数据的统计摘要和性质。也可以提取

# Extract Specific columns.
result <- data.frame(emp.data$emp_name,emp.data$salary)
print(result)

# 先提取前两行,再提取所有列
# Extract first two rows.
result <- emp.data[1:2,]

# 也可以一并提取
result <- emp.data[c(3,5),c(2,4)]

要扩展数据帧只需使用新的列名称添加列向量,注意要使用$对数据帧名称进行索引。或者,添加行用rbind()函数,添加列用cbind()

参考

https://www.w3cschool.cn/

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

推荐阅读更多精彩内容