如果If语句为假,在R中不做任何操作?



我的数据集是这样的:

Date/Time                  Teams          xScore
Saturday, Jan 16th 2021    NA             NA
10:30 AM                   Fulham         0.9125
NA                         Chelsea        1.1634
NA                         Draw           NA
NA                         NA             NA
1:00 PM                    Leicester      1.4562
NA                         Southampton    1.4613
NA                         Draw           NA
NA                         NA             NA
Sunday, Jan 17th 2021      NA             NA
6:00 AM                    Sheffield Utd  0.8965
NA                         Tottenham      1.6542
NA                         Draw           NA
NA                         NA             NA

我试图添加一个新的列,执行计算的xScore不是NA。下面是我要做的一个简单版本:

for (i in 1:length(mytable$xScore)){
if(is.na(mytable$xScore[i]) != TRUE){
if(is.na(mytable$xScore[i+1]) != TRUE){
mytable$HomeAway[i] <- "Home"
mytable$HomeAway[i+1] <- "Away"
}
}
}

当我运行forloop时,我得到这个错误:"替换有2行,数据有49">
在我看来,当两个if条件为假时,循环刚刚停止。我不知道如何让它为每个团队添加一个主场和客场的列。我想让它看起来像这样:

Date/Time                  Teams          xScore   HomeAway
Saturday, Jan 16th 2021    NA             NA       NA
10:30 AM                   Fulham         0.9125   Home
NA                         Chelsea        1.1634   Away 
NA                         Draw           NA       NA
NA                         NA             NA       NA 
1:00 PM                    Leicester      1.4562   Home
NA                         Southampton    1.4613   Away
NA                         Draw           NA       NA 
NA                         NA             NA       NA 
Sunday, Jan 17th 2021      NA             NA       NA
6:00 AM                    Sheffield Utd  0.8965   Home
NA                         Tottenham      1.6542   Away
NA                         Draw           NA       NA
NA                         NA             NA       NA 

问题是您需要首先初始化HomeAway变量:

mytable <- tibble::tribble(
~`Date/Time`,                  ~Teams,          ~xScore,
"Saturday, Jan 16th 2021",    NA,             NA,
"10:30 AM",                   "Fulham",         0.9125,
NA,                         "Chelsea",        1.1634,
NA,                         "Draw",           NA,
NA,                         NA,             NA,
"1:00 PM",                    "Leicester",      1.4562,
NA,                         "Southampton",    1.4613,
NA,                         "Draw",           NA,
NA,                         NA,             NA,
"Sunday, Jan 17th 2021",      NA,             NA,
"6:00 AM",                    "Sheffield Utd",  0.8965,
NA,                         "Tottenham",      1.6542,
NA,                         "Draw",           NA,
NA,                         NA,             NA
)
mytable$HomeAway <- NA
for (i in 1:length(mytable$xScore)){
if(is.na(mytable$xScore[i]) != TRUE){
if(is.na(mytable$xScore[i+1]) != TRUE){
mytable$HomeAway[i] <- "Home"
mytable$HomeAway[i+1] <- "Away"
}
}
}
mytable
# # A tibble: 14 x 4
#   `Date/Time`             Teams         xScore HomeAway
#   <chr>                   <chr>          <dbl> <chr>   
# 1 Saturday, Jan 16th 2021 NA            NA     NA      
# 2 10:30 AM                Fulham         0.912 Home    
# 3 NA                      Chelsea        1.16  Away    
# 4 NA                      Draw          NA     NA      
# 5 NA                      NA            NA     NA      
# 6 1:00 PM                 Leicester      1.46  Home    
# 7 NA                      Southampton    1.46  Away    
# 8 NA                      Draw          NA     NA      
# 9 NA                      NA            NA     NA      
# 10 Sunday, Jan 17th 2021   NA            NA     NA      
# 11 6:00 AM                 Sheffield Utd  0.896 Home    
# 12 NA                      Tottenham      1.65  Away    
# 13 NA                      Draw          NA     NA      
# 14 NA                      NA            NA     NA 

这是避免for循环的解决方案。
which函数查找具有输入的行,然后将home和away交替分配给这些行。

mytable <- structure(list(Date.Time = c("Saturday, Jan 16th 2021", "10:30 AM", 
NA, NA, NA, "1:00 PM", NA, NA, NA, "Sunday, Jan 17th 2021", "6:00 AM", 
NA, NA, NA), Teams = c(NA, "Fulham", "Chelsea", "Draw", NA, "Leicester", 
"Southampton", "Draw", NA, NA, "Sheffield Utd", "Tottenham", 
"Draw", NA), xScore = c(NA, 0.9125, 1.1634, NA, NA, 1.4562, 1.4613, 
NA, NA, NA, 0.8965, 1.6542, NA, NA)), class = "data.frame", row.names = c(NA, 
-14L))

mytable$HomeAway <- NA
#find rows with input in xScore column
filledrows <- which(!is.na(mytable$xScore) )
#Assgin home team to odd rows and visitors to even rowms
mytable$HomeAway[filledrows] <-ifelse(filledrows%%2==0, "Home", "Away")
mytable

我给你留下了dplyr的另一个解决方案。不需要使用for循环

library(tidyr)
library(dplyr)
df <- tribble(
~`Date/Time`             , ~Teams         , ~xScore,
"Saturday, Jan 16th 2021", NA             , NA,
"10:30 AM"               , "Fulham"       , 0.9125,
NA                       , "Chelsea"      , 1.1634,
NA                       , "Draw"         , NA,
NA                       , NA             , NA,
"1:00 PM"                , "Leicester"    , 1.4562,
NA                       , "Southampton"  , 1.4613,
NA                       , "Draw"         , NA,
NA                       , NA             , NA,
"Sunday, Jan 17th 2021"  , NA             , NA,
"6:00 AM"                , "Sheffield Utd", 0.8965,
NA                       , "Tottenham"    , 1.6542,
NA                       , "Draw"         , NA,
NA                       , NA             , NA
)
df %>% 
mutate(HomeAway = case_when(
is.na(lag(xScore)) & !is.na(xScore)  ~ "Home",
!is.na(xScore) & !is.na(lag(xScore)) ~ "Away",
TRUE                                 ~ NA_character_
))
#> # A tibble: 14 x 4
#>    `Date/Time`             Teams         xScore HomeAway
#>    <chr>                   <chr>          <dbl> <chr>   
#>  1 Saturday, Jan 16th 2021 <NA>          NA     <NA>    
#>  2 10:30 AM                Fulham         0.912 Home    
#>  3 <NA>                    Chelsea        1.16  Away    
#>  4 <NA>                    Draw          NA     <NA>    
#>  5 <NA>                    <NA>          NA     <NA>    
#>  6 1:00 PM                 Leicester      1.46  Home    
#>  7 <NA>                    Southampton    1.46  Away    
#>  8 <NA>                    Draw          NA     <NA>    
#>  9 <NA>                    <NA>          NA     <NA>    
#> 10 Sunday, Jan 17th 2021   <NA>          NA     <NA>    
#> 11 6:00 AM                 Sheffield Utd  0.896 Home    
#> 12 <NA>                    Tottenham      1.65  Away    
#> 13 <NA>                    Draw          NA     <NA>    
#> 14 <NA>                    <NA>          NA     <NA>
ind <- !is.na(mytable$xScore)
ind <- which(ind[-length(ind)] & ind[-1])
mytable$HomeAway <- NA_character_
mytable$HomeAway[ind] <- "Home"
mytable$HomeAway[ind+1] <- "Away"
mytable
#                  Date.Time         Teams xScore HomeAway
# 1  Saturday, Jan 16th 2021          <NA>   <NA>     <NA>
# 2                 10:30 AM        Fulham 0.9125     Home
# 3                     <NA>       Chelsea 1.1634     Away
# 4                     <NA>          Draw   <NA>     <NA>
# 5                     <NA>          <NA>   <NA>     <NA>
# 6                  1:00 PM     Leicester 1.4562     Home
# 7                     <NA>   Southampton 1.4613     Away
# 8                     <NA>          Draw   <NA>     <NA>
# 9                     <NA>          <NA>   <NA>     <NA>
# 10   Sunday, Jan 17th 2021          <NA>   <NA>     <NA>
# 11                 6:00 AM Sheffield Utd 0.8965     Home
# 12                    <NA>     Tottenham 1.6542     Away
# 13                    <NA>          Draw   <NA>     <NA>
# 14                    <NA>          <NA>   <NA>     <NA>

相关内容

最新更新