我正在用 geopandas 制作等值线地图。我想绘制具有两层边界的地图:较薄的边界用于民族国家(geopandas 默认),较厚的边界用于各个经济共同体。这在 geopandas 中可行吗?
这是一个例子:
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
africa = world.query('continent == "Africa"')
EAC = ["KEN", "RWA", "TZA", "UGA", "BDI"]
africa["EAC"] = np.where(np.isin(africa["iso_a3"], EAC), 1, 0)
africa.plot(column="pop_est")
plt.show()
Run Code Online (Sandbox Code Playgroud)
我为属于 EAC 组的国家/地区创建了一个虚拟变量。我想在该组国家周围画出更粗的边界,同时保留国家边界。
编辑:
我仍然不知道如何在子图中进行这项工作。这是一个例子:
axs = ["ax1", "ax2"]
vars = ["pop_est", "gdp_md_est"]
fig, axs = plt.subplots(ncols=len(axs),
figsize=(10, 10),
sharex=True,
sharey=True,
constrained_layout=True)
for ax, var in zip(axs, vars):
africa.plot(ax=ax,
column=var,
edgecolor="black",
missing_kwds={
"color": "lightgrey",
"hatch": "///"
})
ax.set_title(var) …
Run Code Online (Sandbox Code Playgroud) 我有矢量具有数值.例如:
inVector <- c(2, -10, 5, 34, 7)
Run Code Online (Sandbox Code Playgroud)
我需要对此进行转换,以便在遇到负面元素时,该负面元素与后续元素相加,直到将该元素转为正数的元素:
outVector <- c(2, 0, 0, 29, 7)
Run Code Online (Sandbox Code Playgroud)
负元素将被设为零,以便保留总和.所以元素2和3将为零,第四个元素等于29 = -10 + 5 + 34.我尝试了这样的for循环解决方案:
outVector <- numeric(length = length(inVector))
for(i in 1:length(inVector)) {
outVector <- inVector
outVector[i] <- ifelse(outVector[i] < 0, 0, outVector[i])
outVector[i + 1] <- ifelse(outVector[i] == 0, sum(inVector[i:(i+1)]), outVector[i + 1])
outVector <- outVector[1:length(inVector)]
}
Run Code Online (Sandbox Code Playgroud)
但那没用.但是,我最感兴趣的是一个在dplyr管道中工作的解决方案.
我有一个具有三个级别的嵌套列表。我需要取消列出中间级别,但我还没有找到一种简单的方法来做到这一点。
例如
df1 <- data.frame(X = sample(100),
Y = sample(100))
df2 <- data.frame(X = sample(50),
Y = sample(50))
df3 <- data.frame(X = sample(150),
Y = sample(150),
Z = sample(150))
df4 <- data.frame(X = sample(20),
Y = sample(20),
Z = sample(20))
list1 <- list(A = df1, B = df2)
list2 <- list(A = df3, B = df4)
masterList <- list(list1, list2)
Run Code Online (Sandbox Code Playgroud)
我想要实现的是
newMasterList <- list(A = rbind(df1,df2), B = rbind(df3,df4))
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用两个递归选项 unlist() 但它们没有产生预期的结果:
newMasterListFAIL1 <- lapply(seq_along(masterList), function(x) unlist(masterList[[x]], recursive = F)) …
Run Code Online (Sandbox Code Playgroud) 我有一个时间序列数据的数据框,每天观察温度.我需要创建一个虚拟变量,计算每天温度高于5C的阈值.这本身很容易,但存在一个附加条件:计数仅在超过阈值连续十天后开始计数.这是一个示例数据帧:
df <- data.frame(date = seq(365),
temp = -30 + 0.65*seq(365) - 0.0018*seq(365)^2 + rnorm(365))
Run Code Online (Sandbox Code Playgroud)
我想我已经完成了,但是我喜欢的循环太多了.这就是我做的:
df$dummyUnconditional <- 0
df$dummyHead <- 0
df$dummyTail <- 0
for(i in 1:nrow(df)){
if(df$temp[i] > 5){
df$dummyUnconditional[i] <- 1
}
}
for(i in 1:(nrow(df)-9)){
if(sum(df$dummyUnconditional[i:(i+9)]) == 10){
df$dummyHead[i] <- 1
}
}
for(i in 9:nrow(df)){
if(sum(df$dummyUnconditional[(i-9):i]) == 10){
df$dummyTail[i] <- 1
}
}
df$dummyConditional <- ifelse(df$dummyHead == 1 | df$dummyTail == 1, 1, 0)
Run Code Online (Sandbox Code Playgroud)
有谁能建议更简单的方法吗?
我需要在 R data.frame 中循环因子级别。在循环内部,我需要对包含由这些级别对定义的子集的 data.frames 进行操作。这些对是该因素的两个连续的唯一级别。
这是我尝试过的示例:
require(dplyr)
df <- data.frame(fac = rep(c("A", "B", "C"), 3))
for(i in levels(fac)){
if(i != levels(fac)[length(levels(fac))]){
df %>% filter(fac %in% c(i, i + 1))
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试包含级别i
及其后续级别,但显然表达i + 1
不会起作用。如何解决这个问题?我是否必须使可变fac
数值或有更简洁的解决方案可用?
编辑:输出(对于这个例子)应该是这两个 data.frames:
dfAB <- df %>% filter(fac %in% c("A", "B"))
dfBC <- df %>% filter(fac %in% c("B", "C"))
Run Code Online (Sandbox Code Playgroud) 我有一个使用 Python 在非洲地图上绘制数据的基本设置matplotlib
。不幸的是,geopandas
自然地球数据库不包括小岛屿国家,而小岛屿国家也必须包括在内。
我的基本设置是这样的:
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
africa = world.query('continent == "Africa"')
africa.plot(column="pop_est")
plt.show()
Run Code Online (Sandbox Code Playgroud)
相反,我想要一个类似这样的图形,其中小岛屿国家由可见点整齐地呈现:
(图来源为:https://en.wikipedia.org/wiki/African_Continental_Free_Trade_Area#/media/File :AfricanContinentalFreeTradeArea.svg )
我有两个问题:1)geopandas
自然地球数据不包括岛屿国家,2)我不知道如何将其他不可见的岛屿国家绘制为可见点。
我在 R 的 SO 中看到了一些相关问题,但它特别是我所追求的 Python 解决方案。
我有一个包含很少分组变量的年度时间序列数据框,我需要添加一个基于特定年份的索引列。
df <- data.frame(YEAR = c(2000,2001,2002,2000,2001,2002),
GRP = c("A","A","A","B","B","B"),
VAL = sample(6))
Run Code Online (Sandbox Code Playgroud)
我想创建一个简单的变量 VAL 索引,即值除以基准年的值,比如 2000:
df$VAL.IND <- df$VAL/df$VAL[df$YEAR == 2000]
Run Code Online (Sandbox Code Playgroud)
这是不对的,因为它不尊重分组变量 GRP。我试过 plyr 但我无法让它工作。
在我的实际问题中,我有几个具有不同时间序列的分组变量,因此我正在寻找一个非常通用的解决方案。
我有一个data.frame,其中有一列整数值。我需要形成一个分组变量,以标识该列中的序列中断。例如,我可以创建另一列升序整数,每当原始列的值不大于其滞后值时就添加一个。我该怎么做呢?
例如,如果我有一个像这样的data.frame:
df <- data.frame(A = c(1,2,4,6,78,3,56,78,23))
Run Code Online (Sandbox Code Playgroud)
我需要一些方法来产生带有列B的新表:
df$B <- c(1,1,1,1,1,2,2,2,3)
Run Code Online (Sandbox Code Playgroud)
我尝试过例如dplyr
:
df %>% mutate(B = 1,
B = case_when(A < lag(A), B + 1))
Run Code Online (Sandbox Code Playgroud)
那不是很正确。
我有一个R数据帧,有两列字符串.在其中一列(例如,Column1)中,存在重复值.我需要重新标记该列,以便将重复的字符串重命名为有序后缀,如Column1.new
Column1 Column2 Column1.new
1 A 1_1
1 B 1_2
2 C 2_1
2 D 2_2
3 E 3
4 F 4
Run Code Online (Sandbox Code Playgroud)
任何有关如何做到这一点的想法将不胜感激.
干杯,
安蒂
假设我有两个矩阵A和B:
A: A1 A2 B: B1 B2
ROW1 V1 V2 ROW1 V3 V4
ROW2 V5 V6 ROW2 V7 V8
Run Code Online (Sandbox Code Playgroud)
我想得到一个结果矩阵R,它包括两个矩阵列中每对的乘积,如下所示:
R: A1_B1 A1_B2 A2_B1 A2_B2
ROW1 V1*V3 V1*V4 V2*V3 V2*V4
ROW2 V5*V7 V5*V8 V6*V7 V6*V8
Run Code Online (Sandbox Code Playgroud)
循环结构可以做,但我想知道是否有更好的选择.
我有一个data.frame,它有几个零值的变量.我需要构造一个额外的变量,它将返回每个观察值不为零的变量组合.例如
df <- data.frame(firm = c("firm1", "firm2", "firm3", "firm4", "firm5"),
A = c(0, 0, 0, 1, 2),
B = c(0, 1, 0, 42, 0),
C = c(1, 1, 0, 0, 0))
Run Code Online (Sandbox Code Playgroud)
现在我想生成新变量:
df$varCombination <- c("C", "B-C", NA, "A-B", "A")
Run Code Online (Sandbox Code Playgroud)
我想到了这样的东西,这显然不起作用:
for (i in 1:nrow(df)){
df$varCombination[i] <- paste(names(df[i,2:ncol(df) & > 0]), collapse = "-")
}
Run Code Online (Sandbox Code Playgroud) 我有一个data.frame
,我想根据正则表达式将其中一列拆分为两列.更具体地说,字符串在括号中有一个后缀,需要将其提取到它自己的列中.
所以我想从这里得到:
dfInit <- data.frame(VAR = paste0(c(1:10),"(",c("A","B"),")"))
Run Code Online (Sandbox Code Playgroud)
到这里:
dfFinal <- data.frame(VAR1 = c(1:10), VAR2 = c("A","B"))
Run Code Online (Sandbox Code Playgroud) 我有一个data.frame有几个变量,我需要根据它们名称中的模式求和.更具体地说,我有总共一个的股票,不包括我需要找到的可能残差.我正在使用dplyr
这个.
示例data.frame:
df <- data.frame(year = c(2000, 2001, 2002),
aShare = c(.1,.2,.3),
bShare = c(.3,.4,.5))
Run Code Online (Sandbox Code Playgroud)
我试过用这样的ends_with
函数:
tmp <- df %>% mutate(otherShare = 1 - sum(ends_with("Share")))
Run Code Online (Sandbox Code Playgroud)
但它不会产生所需的结果:
TMP <- df %>% mutate(otherShare = 1 - (aShare + bShare))
Run Code Online (Sandbox Code Playgroud) r ×11
dataframe ×7
dplyr ×3
loops ×3
geopandas ×2
python ×2
cartopy ×1
choropleth ×1
duplicates ×1
matplotlib ×1
matrix ×1
regex ×1
rename ×1