如何使用grepl和ifelse基于数据帧的第一列创建新列

问题描述 投票:0回答:3

我是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
r csv if-statement grepl
3个回答
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

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

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
© www.soinside.com 2019 - 2024. All rights reserved.