R语言表与因子(详细知识点,深入知识点后续会补充!)

简介: R语言表与因子(详细知识点,深入知识点后续会补充!)

(1) level表示额外的信息,包含向量中不同值的记录

> x<-c(5,12,13,12)
> xf<-factor(x)
> xf
[1] 5  12 13 12
Levels: 5 12 13
#xf中不同数值(5,12,13)就是水平
>length(xf)
[1] 4
#因子的长度定义为数据的长度,而不是水平的长度
#可以提前插入新的水平
> x<-c(5,12,13,12)
> xff<-factor(x,levels = c(5,12,13,88))
> xff
[1] 5  12 13 12
Levels: 5 12 13 88
> xff[2]<-88
> xff
[1] 5  88 13 12
Levels: 5 12 13 88
但是不能添加非法的水平
> xff[2]<-28
Warning message:
In `[<-.factor`(`*tmp*`, 2, value = 28) : 因子层次有错,产生了NA


(2)tapply函数

> ages<-c(25,26,55,37,21,42)
> affils<-c("R","D","D","R","U","D")
> tapply(ages,affils,mean)
 D  R  U 
41 31 21 
这里返回的是mean(u[x]),mean(u[y]),mean(u[z])
#也可以使用自定义函数
x <- c(1, 2, 3, 4, 5, 6)
# 创建一个因子
f <- factor(c("A", "B", "A", "B", "A", "B"))
# 自定义函数,计算每个子集的标准差
my_function <- function(x) {
  return(sd(x))
}
# 使用tapply应用自定义函数
result <- tapply(x, f, my_function)
print(result)
#输出
     A      B 
1.632993 1.632993 
#多因子拆分
x <- c(1, 2, 3, 4, 5, 6)
# 创建两个因子
f1 <- factor(c("A", "A", "B", "B", "A", "B"))
f2 <- factor(c("X", "Y", "X", "Y", "Y", "X"))
# 使用tapply计算平均值
result <- tapply(x, list(f1, f2), mean)
print(result)
#输出
  X   Y
A 3.0 5.0
B 4.5 4.0


(3)split函数

#根据因子拆分向量
x <- c(1, 2, 3, 4, 5, 6)
# 创建一个因子
f <- factor(c("A", "B", "A", "B", "A", "B"))
# 使用 split() 函数拆分向量
result <- split(x, f)
print(result)
#输出
$A
[1] 1 3 5
$B
[1] 2 4 6
#根据向量拆分数据框
# 创建一个数据框
df <- data.frame(
  x = c(1, 2, 3, 4, 5, 6),
  y = c("A", "B", "A", "B", "A", "B")
)
# 使用 split() 函数根据向量拆分数据框
result <- split(df, df$y)
print(result)
#输出
$A
  x y
1 1 A
3 3 A
5 5 A
$B
  x y
2 2 B
4 4 B
6 6 B
#根据自定义函数拆分向量
x <- c(1, 2, 3, 4, 5, 6)
# 自定义函数,根据奇偶性拆分向量
my_function <- function(x) {
  ifelse(x %% 2 == 0, "Even", "Odd")
}
# 使用 split() 函数根据自定义函数拆分向量
result <- split(x, my_function(x))
print(result)
#输出
$Odd
[1] 1 3 5
$Even
[1] 2 4 6


(4)by()函数

by(data, INDICES, FUN, ...)
data:要拆分的数据框、列表或向量。
INDICES:用于拆分数据的因子、列表或向量。
FUN:要应用于每个子集的函数。
...:传递给函数 FUN 的其他参数。
#对数据框的列进行拆分和求和
# 创建一个数据框
df <- data.frame(
  group = rep(c("A", "B", "C"), each = 3),
  value = 1:9
)
# 使用 by() 函数对数据框的 value 列按照 group 列进行拆分和求和
result <- by(df$value, df$group, sum)
print(result)
#输出
df$group: A
[1] 6
------------------------------------------------------------ 
df$group: B
[1] 15
------------------------------------------------------------ 
df$group: C
[1] 24
#对列表中的元素进行拆分和求平均值
list_data <- list(
  A = c(1, 2, 3),
  B = c(4, 5, 6),
  C = c(7, 8, 9)
)
# 使用 by() 函数对列表中的元素进行拆分和求平均值
result <- by(list_data, names(list_data), mean)
print(result)
#输出
names(list_data): A
[1] 2
------------------------------------------------------------ 
names(list_data): B
[1] 5
------------------------------------------------------------ 
names(list_data): C
[1] 8
#对向量进行拆分和自定义操作
# 创建一个向量
x <- c(1, 2, 3, 4, 5, 6)
# 创建一个因子
f <- factor(c("A", "B", "A", "B", "A", "B"))
# 自定义函数,计算每个子集的中位数
my_function <- function(x) {
  return(median(x))
}
# 使用 by() 函数对向量按照因子进行拆分和计算中位数
result <- by(x, f, my_function)
print(result)
#输出
f: A
[1] 2
------------------------------------------------------------ 
f: B
[1] 4


(5)表的操作

> u<-c(22,8,33,6,8,29,-2)
> f1<-list(c(5,12,13,12,13,5,13),c("a","bc","a","a","bc","a","a"))
> tapply(u,f1,length)
   a bc
5  2 NA
12 1  1
#根据以上学习的tapply,得到的分组如下,但是事实上NA应该为0,因为没有第一因子是5,第二银子为"bc"的例子
所以应该用table()建表
> table(f1)
    f1.2
f1.1 a bc
  5  2  0
  12 1  1
  13 2  1
#这里计算的是频数
#这里用一维的频数理解一下
> table(c(5,12,13,12,8,5))
 5  8 12 13 
 2  1  2  1 
#也可以建立三维表
> gender<-c("M","M","F","M","F","F")
> race<-c("W","W","A","O","B","B")
> pol<-c("L","L","C","L","L","C")
> v<-data.frame(gender,race,pol)
> v
  gender race pol
1      M    W   L
2      M    W   L
3      F    A   C
4      M    O   L
5      F    B   L
6      F    B   C
> vt<-table(v)
> vt
, , pol = C
      race
gender A B O W
     F 1 1 0 0
     M 0 0 0 0
, , pol = L
      race
gender A B O W
     F 0 1 0 0
     M 0 0 1 2


(6)对表的矩阵操作

> ct<-read.table("D://ct.dat",header=T)
> ct
  Vote.for.X Voted.For.X.Last.Time
1        YES                   YES
2        YES                    NO
3         NO                    NO
4   Not Sure                   YES
5         NO                    NO
> cttab<-table(ct)
> cttab
          Voted.For.X.Last.Time
Vote.for.X NO YES
  NO        2   0
  Not Sure  0   1
  YES       1   1
#在R中,我们还是把表当作矩阵进行处理
> class(cttab)
[1] "table"
> cttab[1,1]
[1] 2
 NO YES 
  2   0 
#与标量进行运算
> cttab/5
          Voted.For.X.Last.Time
Vote.for.X  NO YES
  NO       0.4 0.0
  Not Sure 0.0 0.2
  YES      0.2 0.2
#以下为Vote.for.X变量的边际值:2+0=2,0+1=1,1+1=2
> apply(cttab,1,sum)
      NO Not Sure      YES 
       2        1        2 
#实际上可以用addmargins()解决边际值问题
> addmargins(cttab)
          Voted.For.X.Last.Time
Vote.for.X NO YES Sum
  NO        2   0   2
  Not Sure  0   1   1
  YES       1   1   2
  Sum       3   2   5
> 
#这样可以得到一个二维的边际数据
#dimnames可以得到边际值的名称和水平值
> dimnames(cttab)
$Vote.for.X
[1] "NO"       "Not Sure" "YES"     
$Voted.For.X.Last.Time
[1] "NO"  "YES"


(7)aggregate()函数

用于按照指定的因子变量对数据进行分组,并对每个组应用一个函数进行聚合操作


aggregate(formula, data, FUN, ...)


formula 是一个公式对象,用于定义要聚合的变量和分组的因子变量。

data 是一个数据框或数据集,包含要聚合的数据。

FUN 是一个函数,用于指定要应用于每个分组的聚合操作。常见的函数有sum、mean、median、max、min等。

df <- data.frame(
  group = c("A", "A", "B", "B", "C", "C"),
  value = c(10, 15, 5, 8, 20, 25)
)
# 使用aggregate函数计算平均值
result <- aggregate(value ~ group, data = df, FUN = mean)
#计算每一组因子的平均值
> result
  group value
1     A  12.5
2     B   6.5
3     C  22.5

(8)cut()函数

cut()函数用于将连续型的数值变量划分为离散的区间


cut(x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE, dig.lab = 3, ...)\


x 是要进行切分的数值变量。

breaks 是用于指定区间的断点。可以有多种不同的方式来指定断点,例如一个整数(表示分割成等宽的区间)、一个向量(表示自定义的断点)、一个数值表示分割的区间个数等。

labels 是可选参数,用于指定每个区间的标签。如果未指定,则默认使用区间的范围作为标签。

当labels = FALSE时,切分后的区间将使用数字表示。例如,如果将数值变量划分为3个区间,那么第一个区间将表示为1,第二个区间表示为2,以此类推。


当labels = TRUE时,切分后的区间将使用字符型的标签表示。默认情况下,将使用区间的范围作为标签。例如,如果将数值变量划分为三个区间,范围分别为(0, 30]、(30, 60]和(60, 100],则标签分别为(0, 30]、(30, 60]和(60, 100]。


include.lowest 是一个逻辑值(TRUE或FALSE),表示是否包括最小值在内的左端点。

right 是一个逻辑值,用于指定区间是否是右开的。

dig.lab 是一个整数,表示标签的小数位数。

values <- c(10, 20, 30, 40, 50, 60, 70)
# 使用cut函数进行切分
cut_values <- cut(values, breaks = c(0, 30, 60, 100))
print(cut_values)
[1] (0,30]   (0,30]   (0,30]   (30,60]  (30,60]  (30,60]  (60,100]
Levels: (0,30] (30,60] (60,100]
> z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88)
> z<-c(0.88,0.28,0.58,0.42,0.46,0.24,0.0528,0.88035)
> seq(from=0.0,to=1.0,by=0.1)
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
> binmarks<-seq(from=0.0,to=1.0,by=0.1)
> cut(z,binmarks,labels = F)
[1] 9 3 6 5 5 3 1 9
#例如z[1],0.88落在第九个区间,即(0.0,0.1]


目录
相关文章
|
6月前
|
数据可视化 Java 数据挖掘
R语言Fama-French三因子模型实际应用:优化投资组合
R语言Fama-French三因子模型实际应用:优化投资组合
|
6月前
|
数据采集 数据可视化
R语言关联规则Apriori对杭州空气质量与气象因子数据研究可视化
R语言关联规则Apriori对杭州空气质量与气象因子数据研究可视化
|
6月前
|
数据可视化 数据挖掘
数据代码分享|R语言主成分(PCA)、主轴因子分析(PA)员工满意度调查数据可视化
数据代码分享|R语言主成分(PCA)、主轴因子分析(PA)员工满意度调查数据可视化
|
6月前
|
数据可视化 数据建模
R语言广义加性混合模型(GAMM)分析长沙气象因子、空气污染、PM2.5浓度、显著性检验、逐日变化可视化(下)
R语言广义加性混合模型(GAMM)分析长沙气象因子、空气污染、PM2.5浓度、显著性检验、逐日变化可视化
|
6月前
|
机器学习/深度学习 数据可视化
R语言广义加性混合模型(GAMM)分析长沙气象因子、空气污染、PM2.5浓度、显著性检验、逐日变化可视化(上)
R语言广义加性混合模型(GAMM)分析长沙气象因子、空气污染、PM2.5浓度、显著性检验、逐日变化可视化
|
6月前
|
数据可视化
数据分享|R语言因子分析、相关性分析大学生兼职现状调查问卷数据可视化报告(下)
数据分享|R语言因子分析、相关性分析大学生兼职现状调查问卷数据可视化报告
|
6月前
|
数据采集 数据可视化 数据挖掘
数据分享|R语言因子分析、相关性分析大学生兼职现状调查问卷数据可视化报告(上)
数据分享|R语言因子分析、相关性分析大学生兼职现状调查问卷数据可视化报告
|
6月前
|
机器学习/深度学习 算法 数据挖掘
R语言气象模型集成预报:神经网络、回归、svm、决策树用环流因子预测降雨降水数据
R语言气象模型集成预报:神经网络、回归、svm、决策树用环流因子预测降雨降水数据
|
6月前
|
移动开发 数据可视化
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(二)
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(二)
|
6月前
|
数据可视化
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(一)
R语言两层2^k析因试验设计(因子设计)分析工厂产量数据和Lenth方法检验显著性可视化|数据分享(一)