所以,我有一个小数据框,就像我的标题所说,我想删除所有以某个字母结尾的行,"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很新,所以我可能会忘记简单的解决方案和简单性,我将不胜感激!提前致谢!
这是一种更简单的方法:
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).
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |