可重复的方式从以特定字符结尾的数据框中删除行

Mat*_*ins 3 string for-loop r

所以,我有一个小数据框,就像我的标题所说,我想删除所有以某个字母结尾的行,"n".

以下代码将为您提供我正在使用的数据:

url = "http://www.basketball-reference.com/leagues/NBA_1980.html"

library(XML)
x1 = readHTMLTable(url)

east.1980 = x1[["E_standings"]]
west.1980 = x1[["W_standings"]]

east.1980 = east.1980[c(1,2)]
west.1980 = west.1980[c(1,2)]

names(east.1980) = c("Team", "W")
names(west.1980) = c("Team", "W")

wins.1980 = rbind(east.1980, west.1980)

wins.1980$Team = gsub("\\b\\d+\\b", "", wins.1980$Team)
wins.1980$Team = gsub(" +"," ",gsub("^ +","",gsub("[^a-zA-Z0-9 ]","",wins.1980$Team)))

View(wins.1980)
Run Code Online (Sandbox Code Playgroud)

以下是数据框外观的示例:

                Team    W
1   Atlantic Division   ?
2   Boston Celtics      61
3   Philadelphia 76ers  59
4   Washington Bullets  39
5   New York Knicks     39
6   New Jersey Nets     34
7   Central Division    ?
8   Atlanta Hawks       50
9   Houston Rockets     41
10  San Antonio Spurs   41
11  Indiana Pacers      37
12  Cleveland Cavaliers 37
13  Detroit Pistons     16
14  Midwest Division    ?
15  Milwaukee Bucks     49
16  Kansas City Kings   47
17  Denver Nuggets      30
Run Code Online (Sandbox Code Playgroud)

基本上,我想删除分区行"Atlantic Division,Central Division等...".恰好所有这些字符串以"n"结尾,所以我试图写一个for循环来删除wins.1980$Team字符串以"n"结尾的所有行.

我希望能够重复这个过程超过30年的数据,因此可重复是必须的.

这是我到目前为止尝试过的两个for循环:

for (i in 1:nrow(wins.1980)) {                      
  if ((str_sub(wins.1980$Team[i], -1)) == "n") {    
    eval(parse(text=paste0("wins.","1980","[-", i, ",]")))  
  }
}




for (i in 1:nrow(wins.1980)) {
  if ((str_sub(wins.1980$Team[i], -1)) == "n") {    
   wins.1980[-i,]                      
  }
}
Run Code Online (Sandbox Code Playgroud)

if ((str_sub(myData$Column[i], -1)) == "letter")如果最后一个字符相等,我已经使用了for循环来做某事,"letter"所以我很确定循环的一部分是有效的.

由于NBA中只有6个分区,我可以使用可重复的内容if (wins.1980$Team == "Atlantic Division" | "Midwest Division" | etc...)然后删除那一行,但是我不觉得我的循环中的问题是选择正确的行,只是删除它们.

当我运行上述每个循环时,我没有遇到任何错误,它运行,但我认为它只是不保存它做什么或什么.

从我上面的示例数据框中拉出来,我希望看起来像:

                 Team   W
2   Boston Celtics      61
3   Philadelphia 76ers  59
4   Washington Bullets  39
5   New York Knicks     39
6   New Jersey Nets     34
8   Atlanta Hawks       50
9   Houston Rockets     41
10  San Antonio Spurs   41
11  Indiana Pacers      37
12  Cleveland Cavaliers 37
13  Detroit Pistons     16
15  Milwaukee Bucks     49
16  Kansas City Kings   47
17  Denver Nuggets      30
Run Code Online (Sandbox Code Playgroud)

而且,我希望能够在更多数据框架上重复这一点.有任何想法吗?

我对R很新,所以我可能会忘记简单的解决方案和简单性,我将不胜感激!提前致谢!

Kar*_*Woo 6

这是一种更简单的方法:

wins.1980[grep("Division$", wins.1980$Team, invert = TRUE), ]
Run Code Online (Sandbox Code Playgroud)

grep("Division$"...匹配Team列中"Division"结尾的任何内容(这可能比选择以n结尾的任何内容更安全,但您可以使用相同的技术执行此操作),并invert = TRUE反转这些匹配,以便您获得所有以"师".使用此子集可以获得所有Team不以"Division"结尾的行.

您可以将此功能应用于许多数据框:

no_div <- function(x) {
  x[grep("Division$", x$Team, invert = TRUE), ]
}
Run Code Online (Sandbox Code Playgroud)

假设你想根据Team列将它们全部子集化; 如果您使用不同的列,则必须修改该函数以获取其他参数.然后用你的数据调用它no_div(wins.1980).