【问题标题】:Loop through a data frame [duplicate]循环遍历数据框[重复]
【发布时间】:2018-10-16 18:07:44
【问题描述】:

我有以下信息:

M_PT

     CEDIS       |              PLAZA        
 9999999021-1    |   10MDA
 9999999021-2    |   10CAN
 9999999012-1    |   10GUD','10CLJ
 9999999012-2    |   10DZV
 9999999025-1    |   10LPB','10HHM','10OBR','10HER
 9999999025-2    |   10DCU

我想最终得到以下结果:

      CEDIS     |  PLAZA       
  9999999021-1  |   10MDA
  9999999021-2  |   10CAN
  9999999012-1  |   10GUD
  9999999012-1  |   10CLJ
  9999999012-2  |   10DZV
  9999999025-1  |   10LPB
  9999999025-1  |   10HHM
  9999999025-1  |   10OBR
  9999999025-1  |   10HER
  9999999025-2  |   10DCU

我尝试执行以下操作,但失败了:

> vec  <- rep(NA,length(unlist(strsplit(M_PT[,"PLAZA"],split="','"))))
> j <- 0
> 
> for(i in 1:nrow(M_PT)){
+ 
+    if(nchar(M_PT[i,"PLAZA"]) == 5){
+    
+         vec[i] <- paste(M_PT[i,"CEDIS"],M_PT[i,"PLAZA"],sep="-")
+       
+          }else{
+ 
+         for(j in 1:sum(nchar(gsub("','","",M_PT[i,"PLAZA"])) / 5)){
+         
+         vec[i + ifelse(j == 1, 0, j - 1)] <- paste(M_PT[i,"CEDIS"], 
unlist(strsplit(M_PT[i,"PLAZA"],split="','"))[j],sep="-")
+ 
+     }
+   }
+ }

请问有什么解决办法吗?

【问题讨论】:

  • 我认为这个问题已经在这里stackoverflow.com/questions/13773770/…stackoverflow.com/questions/15347282/…得到了回答
  • 我已经修复了帖子的结构,现在应该可以理解了。
  • 如果你不想使用包,你可以修改链接重复帖子中的第一个答案,如下所示:s &lt;- strsplit(dat$PLAZA, split = ","); dat &lt;- data.frame(CEDIS = rep(dat$CEDIS, sapply(s, length)), PLAZA = unlist(s)); dat

标签: r loops for-loop dataframe


【解决方案1】:

我们可以使用 包中的separate_rows

library(dplyr)
library(tidyr)

dat2 <- dat %>% separate_rows("PLAZA")
dat2
#           CEDIS PLAZA
# 1  9999999021-1 10MDA
# 2  9999999021-2 10CAN
# 3  9999999012-1 10GUD
# 4  9999999012-1 10CLJ
# 5  9999999012-2 10DZV
# 6  9999999025-1 10LPB
# 7  9999999025-1 10HHM
# 8  9999999025-1 10OBR
# 9  9999999025-1 10HER
# 10 9999999025-2 10DCU

数据

dat <- read.table(text = "   CEDIS        PLAZA        
1 '9999999021-1'                             10MDA
                  2 '9999999021-2'                             10CAN
                  3 '9999999012-1'                     '10GUD, 10CLJ'
                  4 '9999999012-2'                             10DZV
                  5 '9999999025-1'       '10LPB, 10HHM, 10OBR, 10HER'
                  6 '9999999025-2'                             10DCU",
                  header = TRUE, stringsAsFactors = FALSE)

【讨论】:

  • separate_rows 学习新东西,谢谢
  • 如果没有额外的库,有没有办法做到这一点?
【解决方案2】:

通过使用unnest,来自www的数据。

library(dplyr)
library(tidyr)
dat %>%
  transform(COLUMN.NAME.2 = strsplit(COLUMN.NAME.2, ",")) %>%
  unnest(COLUMN.NAME.2)

    COLUMN.NAME COLUMN.NAME.2
1  9999999021-1         10MDA
2  9999999021-2         10CAN
3  9999999012-1         10GUD
4  9999999012-1         10CLJ
5  9999999012-2         10DZV
6  9999999025-1         10LPB
7  9999999025-1         10HHM
8  9999999025-1         10OBR
9  9999999025-1         10HER
10 9999999025-2         10DCU

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2020-11-20
    相关资源
    最近更新 更多