r-如何使用dplyr处理多行条件语句



下面的简化代码连接所有myData数据帧列,除了元素R,只有当数据帧中有多个R元素时,元素R才会连接;如果元素列中只有一个R,则显示单个R而不连接当数据帧的Element列中没有R元素时,代码也应该工作,但它不工作

以下是在存在两个R元素且仅存在一个R元素的情况下运行代码时的正确输出——

具有两个R元素:

Element Group ElementCnt finalCode
1       C     4          1     C.4.1
2       R     0          1     R.0.1
3       C     1          2     C.1.2
4       D     3          1     D.3.1
5       C     8          3     C.8.3
6       R     5          2     R.5.2

带有一个R元素:

Element Group ElementCnt finalCode
1       C     4          1     C.4.1
2       R     0          1         R
3       C     1          2     C.1.2
4       D     3          1     D.3.1
5       C     8          3     C.8.3

在名为rCount的代码中创建的对象显示R元素在myData的元素列中出现的次数。当我在数据帧中不存在R元素的情况下运行代码时,代码会崩溃。我试着用ifelse(Element == "R" & nrow(rCount) > 0 & rCount$counted == 1行来解决这个场景,但它不起作用。

如何正确测试条件语句中的行数,以便代码在没有R元素的场景中正确运行?

简化代码,显示了各种myData数据帧,可轻松运行2/1/0R元素场景:

library(dplyr)
# Two R elements present
myData <-
data.frame(
Element = c("C","R","C","D","C","R"),
Group = c(4,0,1,3,8,5)
)
# One R element present
myData <-
data.frame(
Element = c("C","R","C","D","C"),
Group = c(4,0,1,3,8)
)
# No R elements present
myData <-
data.frame(
Element = c("C","C","D","C"),
Group = c(4,1,3,8)
)
# Code:
rCount <- myData %>% filter(Element == 'R') %>% count(Element, name = 'counted')
seqLabel <- myData %>%
group_by(Element) %>% 
mutate(ElementCnt = row_number()) %>%
ungroup() %>%
mutate(finalCode = 
ifelse(Element == "R" & nrow(rCount) > 0 & rCount$counted == 1,
Element,
paste(Element, Group, ElementCnt,sep = '.')
)
)
print.data.frame(seqLabel)

总之,以下是上述数据帧所需的输出——

两个";R〃;myData数据帧的元素列中的元素(上面的代码做得很好(:

Element Group ElementCnt finalCode
1       C     4          1     C.4.1
2       R     0          1     R.0.1
3       C     1          2     C.1.2
4       D     3          1     D.3.1
5       C     8          3     C.8.3
6       R     5          2     R.5.2

";R〃;myData数据帧的元素列中的元素(上面的代码做得很好(:

Element Group ElementCnt finalCode
1       C     4          1     C.4.1
2       R     0          1         R
3       C     1          2     C.1.2
4       D     3          1     D.3.1
5       C     8          3     C.8.3 

否";R〃;myData数据帧的Elements列中的元素(上面的代码崩溃,但这是我希望看到的输出(:

Element Group ElementCnt finalCode
1       C     4          1     C.4.1
2       C     1          2     C.1.2
3       D     3          1     D.3.1
4       C     8          3     C.8.3

您可以在分组内进行计算。你的方法的问题是,当没有R时,它会返回一些空的东西。你可以检查一下以避免错误,但我相信这更清楚、更有效:

myData |>
group_by(Element) |>
mutate(ElementCnt = row_number(),
finalCode = ifelse(Element == "R" & n() == 1, Element, paste(Element, Group, ElementCnt, sep = "."))) |>
ungroup()

输出:

# A tibble: 6 × 4
Element Group ElementCnt finalCode
<chr>   <dbl>      <int> <chr>    
1 C           4          1 C.4.1    
2 R           0          1 R.0.1    
3 C           1          2 C.1.2    
4 D           3          1 D.3.1    
5 C           8          3 C.8.3    
6 R           5          2 R.5.2    
# A tibble: 5 × 4
Element Group ElementCnt finalCode
<chr>   <dbl>      <int> <chr>    
1 C           4          1 C.4.1    
2 R           0          1 R        
3 C           1          2 C.1.2    
4 D           3          1 D.3.1    
5 C           8          3 C.8.3    
# A tibble: 4 × 4
Element Group ElementCnt finalCode
<chr>   <dbl>      <int> <chr>    
1 C           4          1 C.4.1    
2 C           1          2 C.1.2    
3 D           3          1 D.3.1    
4 C           8          3 C.8.3    

30/jul:用正确的输出更新并删除对OP的误解。

最新更新