我有一个矩阵,其中包含几个国家的行业经济信息。我想做一系列取决于矩阵中元素的位置和相应的列/行名称的计算。
行/列名称包含三个字母的国家/地区代码,后跟行业编号。行名称和列名称相同。
计算如下:
我将举一个简单的例子,尽管我的数据比这个例子大得多。
假设我有矩阵a
set.seed(10)
a <- matrix(sample(36) , nrow = 6)
colnames(a) <- rownames(a) <- paste( rep(c("aaa" , "bbb" , "ccc") , each = 2), rep(c(1:2) , times = 3))
Run Code Online (Sandbox Code Playgroud)
给予:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 9 19 26 6 5 21
aaa 2 10 24 2 30 36 27
bbb 1 12 15 13 11 20 16
bbb 2 8 28 33 18 34 17 …Run Code Online (Sandbox Code Playgroud) 我正在弄清楚如何将矩阵的第 n 列除以行向量的第 n 个元素。
例如,设矩阵 a 和向量 b 为:
a <- matrix(1:9, byrow = TRUE, nrow = 3)
b <- c(3:5)
Run Code Online (Sandbox Code Playgroud)
给予
[[1]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[3,] 7 8 9
[[2]]
[1] 3 4 5
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我正在寻找将矩阵的第一列除以 3、第二列除以 4、第三列除以 5 的代码。
我尝试使用 apply 函数但没有成功
c <- apply(a, 2, function(x) x / b)
Run Code Online (Sandbox Code Playgroud)
是否有任何代码可以使用 apply 并且最好不使用循环来做到这一点?
这个问题类似于我在这里提出的问题.我再次有一个非常大的矩阵,其行名和列名相同.这些名称是三个字母的字符串后跟一个数字.三个字母的字符串重复,只有数字会改变.重复几次后,字符串会发生变化,数字会再次从1开始.
基本上我正在寻找的是根据每个元素的行名和列名进行特定的计算.
我将举一个我正在寻找的小例子.这是一个矩阵a:
matrix <- matrix(c(1:36), nrow = 6, byrow = TRUE)
names <- paste(rep(c("aaa" , "bbb", "ccc"), each = 2) , rep(c(1:2) , times = 3))
rownames(matrix) <- names
colnames(matrix) <- names
Run Code Online (Sandbox Code Playgroud)
这给了:
aaa 1 aaa 2 bbb 1 bbb 2 ccc 1 ccc 2
aaa 1 1 2 3 4 5 6
aaa 2 7 8 9 10 11 12
bbb 1 13 14 15 16 17 18
bbb 2 19 20 …Run Code Online (Sandbox Code Playgroud) 我有一个列名和行名的数据,其字符串的数字从1到100.
我使用grepl来选择具有特定数字的名称(忽略字符串).说我有:
a <- matrix(c(1:16), nrow = 4, byrow = TRUE)
colnames(a) <- c("aaa1", "bbb1", "abc11", "ccc100")
rownames(a) <- c("aaa1", "bbb1", "abc11", "ccc100")
Run Code Online (Sandbox Code Playgroud)
给矩阵 a
aaa1 bbb1 abc11 ccc100
aaa1 1 2 3 4
bbb1 5 6 7 8
abc11 9 10 11 12
ccc100 13 14 15 16
Run Code Online (Sandbox Code Playgroud)
我想选择包含"1"的行和列,但没有别的.像这样:
aaa1 bbb1
aaa1 1 2
bbb1 5 6
Run Code Online (Sandbox Code Playgroud)
但是当我使用时:
a[grepl("1" , rownames(a)) , grepl("1" , colnames(a))]
Run Code Online (Sandbox Code Playgroud)
我a再次获得矩阵.我尝试使用"^ 1",但它当然没有找到任何正确的名称1.我该怎么做才能解决这个问题?我感谢任何帮助.
我正在创建一个包含亚洲大陆分区统计图的新图形,但想在每个国家/地区上方添加条形图。理想情况下,我想创建这样的东西: https: //forum.generic-mapping-tools.org/t/how-to-plot-bar-charts-on-world-map/959
我知道这个问题之前已经被问过好几次了,但是这些问题似乎比较旧,并且使用了不再支持的软件包。我的方法是复制这个问题。
我从Eurostat下载了形状文件,并成功计算了形状文件地图中每个国家的质心:
library(sf)
library(tidyverse)
map <- read_sf(dsn = "C:/Users/Adrian/Desktop/PhD/Data/ne_50m_admin_0_countries",
layer = "ne_50m_admin_0_countries")
asia <- map[ map$CONTINENT %in% "Asia", ]
asia <- asia %>% mutate(centroids = st_centroid(st_geometry(.)))
asia <- asia %>% mutate(long = unlist(map(asia$centroids,1)) ,
lat = unlist(map(asia$centroids, 2)))
ggplot(data = asia) +
geom_sf() + coord_sf() +
geom_point(data = asia, aes(x = long, y = lat) ,
size = 2 )
Run Code Online (Sandbox Code Playgroud)
给予:
但我不知道如何继续。我想在地图上的每个中心点或附近添加一个条形图(避免任何重叠),并用一个小标签表示国家/地区。
像这样的东西:
library(reshape2)
data <- as.data.frame(asia)
data <- data %>%
select(GU_A3 , POP_EST …Run Code Online (Sandbox Code Playgroud) 我有一个对象,它是一个带有向量的巨大矩阵,它包含一个三个字母的字符串,后跟一个数字,例如:
"aaa1" , "aaa2" , "aaa3" , "bbb1" ...
Run Code Online (Sandbox Code Playgroud)
我想重新编写此列,以便值 1-9 包含 01-09,例如:
"aaa01" , "aaa02" , "aaa03" , "bbb01" ...
Run Code Online (Sandbox Code Playgroud)
有没有办法有效地做到这一点?
我想出的一种解决方案是使用
a <- substr(object$column , 1 , 3)
Run Code Online (Sandbox Code Playgroud)
然后用sprintf像粘贴字符串
paste(a ,rep(sprintf("%02d",1:50))
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来解决这个问题?
编辑:我的样本中的数字可以超过 10