小编Adr*_*ian的帖子

匹配行和列名称中包含的数字的矩阵计算

我有一个矩阵,其中包含几个国家的行业经济信息。我想做一系列取决于矩阵中元素的位置和相应的列/行名称的计算。

行/列名称包含三个字母的国家/地区代码,后跟行业编号。行名称和列名称相同。

计算如下:

  1. 对于连续的每个元素,都会有一个匹配的国家和行业
  2. 保持产业组合不变,将纯同一国家的产业与比赛内其他国家的相同产业相乘。

我将举一个简单的例子,尽管我的数据比这个例子大得多。

假设我有矩阵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)

r matrix

12
推荐指数
3
解决办法
301
查看次数

将矩阵的列除以向量的元素

我正在弄清楚如何将矩阵的第 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 并且最好不使用循环来做到这一点?

r

6
推荐指数
2
解决办法
7168
查看次数

根据行名称和列名称的数字和字符串乘以矩阵的元素(2)

这个问题类似于我在这里提出的问题.我再次有一个非常大的矩阵,其行名和列名相同.这些名称是三个字母的字符串后跟一个数字.三个字母的字符串重复,只有数字会改变.重复几次后,字符串会发生变化,数字会再次从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)

r

5
推荐指数
1
解决办法
185
查看次数

使用grepl匹配具有一个特定数字的名称

我有一个列名和行名的数据,其字符串的数字从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.我该怎么做才能解决这个问题?我感谢任何帮助.

r grepl

5
推荐指数
1
解决办法
162
查看次数

Shapefile 地图上的条形图?

我正在创建一个包含亚洲大陆分区统计图的新图形,但想在每个国家/地区上方添加条形图。理想情况下,我想创建这样的东西: 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)

r r-sf

5
推荐指数
1
解决办法
284
查看次数

修改字符串以将 1 转换为 01

我有一个对象,它是一个带有向量的巨大矩阵,它包含一个三个字母的字符串,后跟一个数字,例如:

"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

r

1
推荐指数
1
解决办法
63
查看次数

标签 统计

r ×6

grepl ×1

matrix ×1

r-sf ×1