【问题标题】:R - Copy cell to new column if condition metR - 如果满足条件,将单元格复制到新列
【发布时间】:2018-08-23 22:11:34
【问题描述】:

我正在处理一个运动数据集,该数据集位于具有两个列的数据框中:比赛时间和事件。该事件始终是少数选项之一(尝试、犯规、换人等......)。

我想按事件将事件拆分为新列,因此想编写一个循环,显示“IF [CELL] contains ["event"] copy to column [3] else write [''] in第 [3] 列”

我想我可以用一个 for 循环和一个 ifelse 和 grepl 函数来做到这一点。

现在我有以下内容

for (row in 1:nrow(match_data)){

  ifelse((grepl("Attempt", match_data[row,2]), match_data[row,3] <- match_data[row,2] ,     match_data[row,3] <- '')

}

我认为这是针对每一行,如果 match_data[row, column 2] 包含“尝试”然后将 match_data[row, column 3] 设置为 match_data[row, column 2] 中的任何内容,否则设置 match_data[row ,第 3 列] 到 ''。

代码正确执行测试,因为整数被输入到存在“尝试”的正确行中。但是,输入的似乎是随机整数,而不是匹配单元格中的文本。

我认为这可能与函数使用的数据类型有关,但我在这里搜索了这个问题,似乎我正在使用的函数可以使用字符串,所以我看不出有什么问题发生在这里?

提前致谢!

【问题讨论】:

  • 你能dput()你的数据吗?这样我们就可以尝试重现它/让它变得更好(没有 for 循环)
  • 一种更易读的形式,即使保留for 循环也会是match_data[row,3] &lt;- ifelse(grepl("Attempt", match_data[row,2]), match_data[row,2] , "') `

标签: r grepl


【解决方案1】:

使用 case_when 易于阅读、编写和修改

install.packages("tidyverse")

library(tidyverse)
match_data %>% 
  mutate(newcol = case_when(event == "goal" ~ "goal"
                            , event == "own goal" ~ "goal"
                            , event == "goal" & time = "01:00" ~ "first goal"  # just an example for multiple conditions
                            , TRUE ~ "no goal"))  # else statement

【讨论】:

  • 谢谢,这似乎更好,我一直试图让它工作一段时间。目前,我已将其简化为仅在发生尝试的单元格中输入“1”,因此具有以下内容: match_data %>% mutate(new.col = case_when(Event == "Attempt" ~ "1", TRUE ~ "")) 但是它没有做任何事情,但也没有打印任何错误。你能看出我犯了什么错误吗?
  • 请考虑 R 区分大小写,其他事情是您需要将对象分配给 with
  • 谢谢!我没有分配它,所以这有很大帮助。玩了几分钟后,看起来 LHS 必须完全匹配,而不是仅仅包含值。所以我使用了 case_when 和 grepl 的组合: match_data % mutate(Attempts = case_when(grepl("Attempt",Event) ~ "1", TRUE ~ ""))
猜你喜欢
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2021-08-25
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多