微信扫一扫 分享朋友圈

已有 280 人浏览分享

开启左侧

R语言基础(3)-向量操作基础

[复制链接]
280 0
01.认识数据框。
  • 每一列中每一行都是相同的数据类型。
  • 单独的一列可以称为一个向量

02.向量的生成
c(1,2,3,4,5)   #生成一串数字
c("a","b","a","s","d","f")  #生成字符


1:5 #生成连续的数字

rep("x",times=66)   #重复生成
seq(from=5,to=22,by=4)  #有规律的序列
rnorm(n=3)  #随机


paste0(rep("x",times=3),1:3)

03.对单个向量的操作
x<-c(1,4,6,11)   #赋值
x+1
log(x)
sqrt(x)    #对向量进行运算
x>3
x==3 #比较运算,生成逻辑值向量


max(x) #最大值
min(x) #最小值
mean(x) #平均值
median(x) #中位数
var(x) #方差
sd(x) #标准差
sum(x) #总和


length(x) #向量个数
unique(x) #去重复,留下唯一
duplicated(x) #看有没有重复,给出逻辑值
table(x)  #重复值统计
sort(x)   #排序


04.参数的默认值,比如?soft


05.数据类型的转换优先顺序
如下。能看出什么吧。怎么应用这一特性后续再记录。
c(1,"a")
c(TRUE,"a")
c(TRUE,FALSE,4)


06.如何统计TRUE 和 FALSE 值有多少个
列举了一些方法,还有其他的,
a. **使用`sum()`函数**:
   - 统计`TRUE`:`sum(v)`
   - 统计`FALSE`:`sum(!v)`
b. **使用`length()`和`which()`**:
   - 统计`TRUE`:`length(which(v))`
   - 统计`FALSE`:`length(which(!v))`
c**使用`table()`函数**:
   - 直接生成一个包含`TRUE`和`FALSE`计数的表:`table(v)`
d. **使用`Filter()`函数**:
   - 统计`TRUE`:`length(Filter(identity, v))`
   - 统计`FALSE`:`length(Filter(function(x) !x, v))`
e **使用`aggregate()`函数**:
   - 分组统计:`aggregate(v ~ v, data = data.frame(v), length)`
f**使用`dplyr`包的`summarise()`和`group_by()`**:
   - 更具可读性的方法:`dplyr::summarise(dplyr::group_by(data.frame(v), v), Count = n())`
g. **使用`mean()`函数计算比例**,再乘以总数得到数量:
   - `mean(v) * length(v)` 计算`TRUE`的数量
   - `(1 - mean(v)) * length(v)` 计算`FALSE`的数量


06.两个向量的操作
向量的比较有哪些
vector1 <- c(4, 8, 15, 16, 23, 42)
vector2 <- c(3, 1, 6, 19, 18, 7)

# 比较基本统计量
sum_v1 <- sum(vector1)
sum_v2 <- sum(vector2)
mean_v1 <- mean(vector1)
mean_v2 <- mean(vector2)
median_v1 <- median(vector1)
median_v2 <- median(vector2)

#逐元素比较:这会检查每个位置的元素是否相等。
vector1 == vector2

#全部相等检查:这会判断两个向量是否在所有位置上完全相同。
identical(vector1, vector2)


# 检查长度
length_equal <- length(vector1) == length(vector2)

# 计算相关性
correlation <- cor(vector1, vector2)

# 输出结果
print(c(sum_v1, sum_v2, mean_v1, mean_v2, median_v1, median_v2, length_equal, correlation))

# 绘图比较
plot(vector1, type='o', col='blue', ylim=c(min(c(vector1, vector2)), max(c(vector1, vector2))))
lines(vector2, type='o', col='red')


向量间计算,结果展示不全,自己尝试
# 基本运算
addition <- vector1 + vector2            # 对两个向量逐元素求和
subtraction <- vector1 - vector2         # 对两个向量逐元素求差
element_multiply <- vector1 * vector2    # 对两个向量逐元素相乘
element_divide <- vector1 / vector2      # 对两个向量逐元素相除

# 统计比较
mean_difference <- mean(vector1) - mean(vector2)  # 计算两个向量均值的差异
median_difference <- median(vector1) - median(vector2)  # 计算两个向量中位数的差异
variance_ratio <- var(vector1) / var(vector2)  # 计算两个向量方差的比例
sd_ratio <- sd(vector1) / sd(vector2)  # 计算两个向量标准差的比例

# 相关性和协方差
correlation <- cor(vector1, vector2)    # 计算两个向量之间的相关系数
covariance <- cov(vector1, vector2)     # 计算两个向量之间的协方差

# 统计测试
t_test_results <- t.test(vector1, vector2)  # 对两个向量进行 t 检验
wilcox_test_results <- wilcox.test(vector1, vector2)  # 对两个向量进行 Wilcoxon 秩和检验

# 向量操作
combined_vector <- c(vector1, vector2)    # 合并两个向量
sorted_vector1 <- sort(vector1)           # 对第一个向量进行排序
sorted_vector2 <- sort(vector2)           # 对第二个向量进行排序

# 集合操作
union_elements <- union(vector1, vector2)  # 获取两个向量的并集
intersect_elements <- intersect(vector1, vector2)  # 获取两个向量的交集
setdiff_vector1_vector2 <- setdiff(vector1, vector2)  # 获取第一个向量中不在第二个向量中的元素
setdiff_vector2_vector1 <- setdiff(vector2, vector1)  # 获取第二个向量中不在第一个向量中的元素

# 输出所有结果
results <- list(
  addition = addition,
  subtraction = subtraction,
  element_multiply = element_multiply,
  element_divide = element_divide,
  mean_difference = mean_difference,
  median_difference = median_difference,
  variance_ratio = variance_ratio,
  sd_ratio = sd_ratio,
  correlation = correlation,
  covariance = covariance,
  t_test_p_value = t_test_results$p.value,
  wilcox_p_value = wilcox_test_results$p.value,
  combined_vector = combined_vector,
  sorted_vector1 = sorted_vector1,
  sorted_vector2 = sorted_vector2,
  union_elements = union_elements,
  intersect_elements = intersect_elements,
  setdiff_vector1_vector2 = setdiff_vector1_vector2,
  setdiff_vector2_vector1 = setdiff_vector2_vector1
)


横向连接(c()函数): 使用 c() 函数可以将两个向量端到端地拼接起来,形成一个更长的向量。  
combined_vector <- c(vector1, vector2)
combined_vector


纵向连接(rbind()函数): 如果向量的长度相同,你可以使用 rbind() 来纵向连接它们,使每个向量成为新矩阵的一行。  
combined_matrix <- rbind(vector1, vector2)
combined_matrix


横向连接(cbind()函数): 类似地,cbind() 函数可以将向量作为列来组合,形成一个两列的矩阵。  
combined_matrix <- cbind(vector1, vector2)
combined_matrix


通过paste() 函数连接起来  

# 使用默认的空格分隔符连接
combined_vector_space <- paste(vector1, vector2)

# 使用自定义分隔符连接
combined_vector_dash <- paste(vector1, vector2, sep="-")

# 输出结果
print(combined_vector_space)
print(combined_vector_dash)


长度不同的两个向量操作
==比较,在这个例子中,vector1 和 vector2 的长度分别为 5 和 8。当执行比较 vector1 == vector2 时,R 会尝试通过循环方式扩展 vector1,使其长度与 vector2 相匹配。vector1 会被循环扩展成 c(5, 10, 15, 20, 25, 5, 10, 15)。
比较结果是两个向量的逐元素比较。如果长度不匹配,R 通常会发出一个警告,提醒循环扩展可能带来的问题。
# 已定义的向量
vector1 <- c(5, 10, 15, 20, 25)  # 长度为5
vector2 <- c(2, 4, 6, 8, 10, 12, 14, 16)  # 长度为8

# 使用 == 进行比较
comparison <- vector1 == vector2

07.%in%的作用
在下面这个例子中,vector1 %in% vector2 将检查 vector1 中的每个元素是否存在于 vector2 中。因为 vector1 中只有元素 10 在 vector2 中,所以这段代码的输出将是 FALSE, TRUE, FALSE, FALSE, FALSE,显示 10 存在于 vector2,而其他元素不在 vector2 中。
# 定义向量
vector1 <- c(5, 10, 15, 20, 25)  # 长度为5
vector2 <- c(2, 4, 6, 8, 10, 12, 14, 16)  # 长度为8

# 使用 %in% 检查 vector1 中的元素是否在 vector2 中
in_vector2 <- vector1 %in% vector2

# 输出结果
print(in_vector2)

在这个示例中,characters %in% specific_chars 生成一个逻辑向量,其中 TRUE 表示该位置的字符是 'A' 或 'B'。table() 函数则统计此逻辑向量中 TRUE 和 FALSE 的数量,从而直接给出 'A' 和 'B' 字符的总数以及不是 'A' 或 'B' 的字符总数。这种方法直接且有效地给出了所需的统计数据。  
# 生成一个含有30个随机字母(A到E)的向量
characters <- sample(c('A', 'B', 'C', 'D', 'E'), 30, replace = TRUE)

# 定义要查找的字符
specific_chars <- c('A', 'B')

# 使用 %in% 和 table() 统计特定字符的出现次数
counts <- table(characters %in% specific_chars)

# 打印结果
print(counts)


x==y和x%in%y的差别
假设有两个向量,x 和 y,其中 x 长度为4,如 [1, 2, 3, 4],而 y 长度为3,如 [4, 2, 3]。
  • 使用 x == y 比较时,因为 x 和 y 长度不同,R 会自动循环扩展 y 以匹配 x 的长度,变为 [4, 2, 3, 4]。然后逐元素比较,得到结果为 [FALSE, TRUE, TRUE, TRUE]。这种方法适合顺序敏感且需要位置匹配的场景。
  • 使用 x %in% y 比较时,会检查 x 中的每个元素是否在 y 中存在,不考虑顺序和长度,结果为 [FALSE, TRUE, TRUE, TRUE]。这种方法用于检查元素的存在性,比如适合成员资格验证。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

0

关注

0

粉丝

17

主题
精彩推荐
热门资讯
网友晒图
图文推荐

免责声明|手机版|小黑屋|BIOFUN.CLOUD ( 苏ICP备2022022893号-2 )

GMT+8, 2025-1-3 06:23 , Processed in 0.095601 second(s), 31 queries .

Powered by Discuz! X3.5

© 2020-2030 Biofun Team. 苏ICP备2022022893号-2