我是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
答案 0 :(得分:0)
也许这个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
答案 1 :(得分:0)
你在找这个吗?
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
答案 2 :(得分:0)
这是通过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