【问题标题】:R for loop help to trim based on conditionR for 循环帮助根据条件进行修剪
【发布时间】:2022-01-08 23:18:22
【问题描述】:

我是 R 新手,正在为 for 循环苦苦挣扎: 我想根据条件在 df 中拆分一些字符串 我的df:

我想拆分以“X”开头的位置 识别我正在使用 - grepl("X.",df1[,1]) 拆分 - str_split_fixed(df1[,1],"X",2)[,2] 并且不确定如何将其合并到循环中...

for (i in df1[,1]){
  # if (begins with X) then split
}

所以这里的目标是从 df 行(11 和 12)中去除“X”

提前谢谢你!

【问题讨论】:

  • 也许还有很多其他的选择,但我对使用 for 循环选项特别感兴趣。谢谢!
  • (1) 请不要发布代码/数据/错误的图像:它会破坏屏幕阅读器并且无法复制或搜索(参考:meta.stackoverflow.com/a/285557xkcd.com/2116)。请直接包含代码、控制台输出或数据(例如,data.frame(...) 或来自dput(head(x)) 的输出)。 (2) 你的预期输出是什么?
  • 我的预期输出是使用 for 循环选项从第 11 行和第 12 行去除“X”。

标签: r for-loop trim


【解决方案1】:

R 是一种矢量化语言,因此您可以在一行中将前面的 "X" 替换为 ""

df1[,1] <- sub("^X", "", df1[,1])

在这种情况下使用 for 循环会非常低效,但如果你坚持这样做,那么

for (i in seq_along(df1[,1])) {
  if (substr(df1[i,1],1,1) == "X")
    df1[i,1] <- substring(df1[i,1],2)
}

数据

df1 <- structure(list(header1 = c("PLAYERID", "YEARID", "STINT", "TEAMID", 
"LGID", "G", "G_BATTING", "AB", "R", "H", "X2B", "X3B", "HR", 
"RBI", "SB", "CS", "BB", "SO", "IBB", "HBP", "SH", "SF", "GIDP", 
"G_OLD")), class = "data.frame", row.names = c(NA, -24L))

【讨论】:

  • 感谢大家的解决方案和建议。
  • 另外,如果有人能分享任何关于循环如何以及在幕后发生的事情的好文章或视​​频,我将不胜感激。谢谢!
【解决方案2】:

for循环

for(i in seq_along(df$header1)){ df$header1[i] <- sub("^X","",df$header1[i]) }
df
      header1
1    DGIGACAE
2  DFGGFAEHBD
3        BIBH
4          EB
5      DHBDFC
6         2BD
7        3GDE
8     DEAEFGE
9           I
10    FFBGDBD

更好的矢量化

df$header1 <- sub("^X","",df$header1)
df
      header1
1    DGIGACAE
2  DFGGFAEHBD
3        BIBH
4          EB
5      DHBDFC
6         2BD
7        3GDE
8     DEAEFGE
9           I
10    FFBGDBD

数据

df <- structure(list(header1 = c("DGIGACAE", "DFGGFAEHBD", "BIBH", 
"EB", "DHBDFC", "X2BD", "X3GDE", "DEAEFGE", "I", "FFBGDBD")), row.names = c(NA, 
-10L), class = "data.frame")

【讨论】:

    【解决方案3】:

    stringr解决方案

    我意识到您想使用循环,而其他 2 个解决方案给了您,加上一个矢量化解决方案。如果您正在使用tidyverse,您也可以使用str_replace 来执行此操作:

    df1 <- structure(list(header1 = c("PLAYERID", "YEARID", "STINT", "TEAMID", 
                                      "LGID", "G", "G_BATTING", "AB", "R", "H", "X2B", "X3B", "HR", 
                                      "RBI", "SB", "CS", "BB", "SO", "IBB", "HBP", "SH", "SF", "GIDP", 
                                      "G_OLD")), class = "data.frame", row.names = c(NA, -24L))
    
    df1
    
    library(tidyverse)
    
    df1 %>% mutate(header1 = str_replace(header1, "^X", ""))
    

    输出:

         header1
    1   PLAYERID
    2     YEARID
    3      STINT
    4     TEAMID
    5       LGID
    6          G
    7  G_BATTING
    8         AB
    9          R
    10         H
    11        2B
    12        3B
    13        HR
    14       RBI
    15        SB
    16        CS
    17        BB
    18        SO
    19       IBB
    20       HBP
    21        SH
    22        SF
    23      GIDP
    24     G_OLD
    

    所以...你有很多选择。不过,我认为其他答案比您的直接问题更好。

    【讨论】:

      猜你喜欢
      • 2017-05-04
      • 2019-02-23
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-21
      • 2011-07-28
      • 2021-11-16
      相关资源
      最近更新 更多