我是R和SO的新手,在我的数据集中找到了很多东西之后,我对这个新的挑战感到困惑。我正在研究.csv数据集,我正在使用r进行数据处理。
如果您看到,第一列标签显示为“区/子区”。在该列中,区域名称以下划线开头,子区域名称按原样写入。现在我需要做的是在我的.csv中创建一个新列(第5列),标签为'District'。我需要知道如何使用grepl和/或ifelse根据第一列填充新列,如下所示。我将使用区名<_A>的示例。
新列应包含与区<_A>的值对应的值<_A>和区域下的子区域的值,例如,在第一列中。同样,这应该重复其他区域,例如下一个区域名称<_E>及其子区域。
我知道如何在R中加载数据并设置工作目录等。我只需要特定的帮助,我正在寻找这个输出的代码。甚至某种通用形式也会有所帮助。对这个问题的缺点表示歉意。
样本数据:
District/Subdistrict X Y Z
_A 10 12 13
B 8 40 15
C 21 22 23
D 32 40 21
_E 24 94 97
F 56 72 12
G 35 23 12
H 54 23 17
预期产出
District/Subdistrict X Y Z District
_A 10 12 13 _A
B 8 40 15 _A
C 21 22 23 _A
D 32 40 21 _A
_E 24 94 97 _E
F 56 72 12 _E
G 35 23 12 _E
H 54 23 17 _E
你在找这个吗?
rep(grep("_",dat[,1],value = T),table(cumsum(grepl("_",dat[,1]))))
[1] "_A" "_A" "_A" "_A" "_E" "_E" "_E" "_E"
甚至:
cut(m<-cumsum(s<-grepl("_",dat[,1])),length(unique(m)),dat[s,1])
[1] _A _A _A _A _E _E _E _E
Levels: _A _E
这是通过ave
的另一个想法,
with(df, ave(District.Subdistrict, cumsum(grepl('_', District.Subdistrict)),
FUN = function(i) head(i, 1)))
#[1] _A _A _A _A _E _E _E _E
#Levels: _A _E B C D F G H
也许这个tidyverse
变种可以帮助你。
library(tidyverse)
只是为了我的目的来获取你的数据样本我通过tribble()
创建一个tibble。因为你已经将数据作为data.frame
(我想)你可以忽略它。
df <- tibble::tribble(~`District/Subdistrict`, ~X, ~Y, ~Z,
"_A", 10, 12, 13,
"B", 8, 40, 15,
"C", 21, 22, 23,
"D", 32, 40, 21,
"_E", 24, 94, 97,
"F", 56, 72, 12,
"G", 35, 23, 12,
"H", 54, 23, 17)
现在代码有望帮助您:
df %>%
mutate(District = if_else(grepl("^_", `District/Subdistrict`), `District/Subdistrict`, NA_character_)) %>%
fill(District) %>%
as.data.frame()
# District/Subdistrict X Y Z District
# 1 _A 10 12 13 _A
# 2 B 8 40 15 _A
# 3 C 21 22 23 _A
# 4 D 32 40 21 _A
# 5 _E 24 94 97 _E
# 6 F 56 72 12 _E
# 7 G 35 23 12 _E
# 8 H 54 23 17 _E