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

时间:2017-12-29 06:55:35

标签: r csv if-statement grepl

我是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

3 个答案:

答案 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