簡體   English   中英

用 R dplyr 中另一列的值替換一列的值

[英]Replace the values of one column with values of another column in R dplyr

我有一個看起來像這樣的數據框。 我想在 dplyr 管道內僅用來自制造商列的值替換閾值列的前 7 行。

library(tidyverse)

mpg %>% 
  arrange(cty) %>% 
  mutate(threshold=NA) %>% 
  select(manufacturer,cty, threshold)
#> # A tibble: 234 × 3
#>    manufacturer   cty threshold
#>    <chr>        <int> <lgl>    
#>  1 dodge            9 NA       
#>  2 dodge            9 NA       
#>  3 dodge            9 NA       
#>  4 dodge            9 NA       
#>  5 jeep             9 NA       
#>  6 chevrolet       11 NA       
#>  7 chevrolet       11 NA       
#>  8 chevrolet       11 NA       
#>  9 dodge           11 NA       
#> 10 dodge           11 NA       
#> # … with 224 more rows

使用reprex v2.0.2創建於 2022-08-31

我希望我的數據看起來像這樣

#>    manufacturer   cty threshold
#>    <chr>        <int> <lgl>    
#>  1 dodge            9 dodge      
#>  2 dodge            9 dodge       
#>  3 dodge            9 dodge       
#>  4 dodge            9 dodge      
#>  5 jeep             9 jeep      
#>  6 chevrolet       11 chevrolet        
#>  7 chevrolet       11 chevrolet       
#>  8 chevrolet       11 NA       
#>  9 dodge           11 NA       
#> 10 dodge           11 NA  

任何幫助和指導一如既往地受到高度贊賞

使用case_when創建帶有row_number()的邏輯條件以進行替換。 另外,不需要創建一個空白列,即在NAs中可以默認填寫case_when

library(dplyr)
library(ggplot2)
mpg %>% 
  arrange(cty) %>%   
  select(manufacturer, cty) %>% 
  mutate(threshold = case_when(row_number() < 7 ~manufacturer))

-輸出

# A tibble: 234 × 3
   manufacturer   cty threshold
   <chr>        <int> <chr>    
 1 dodge            9 dodge    
 2 dodge            9 dodge    
 3 dodge            9 dodge    
 4 dodge            9 dodge    
 5 jeep             9 jeep     
 6 chevrolet       11 chevrolet
 7 chevrolet       11 <NA>     
 8 chevrolet       11 <NA>     
 9 dodge           11 <NA>     
10 dodge           11 <NA>     
# … with 224 more rows

這是使用帶有ifelse%in% row_number()的版本:

mpg %>% 
  arrange(cty) %>% 
  mutate(threshold=NA) %>% 
  select(manufacturer,cty, threshold) %>% 
  mutate(threshold = ifelse(row_number() %in% 1:7, manufacturer, threshold))
   manufacturer   cty threshold
   <chr>        <int> <chr>    
 1 dodge            9 dodge    
 2 dodge            9 dodge    
 3 dodge            9 dodge    
 4 dodge            9 dodge    
 5 jeep             9 jeep     
 6 chevrolet       11 chevrolet
 7 chevrolet       11 chevrolet
 8 chevrolet       11 NA       
 9 dodge           11 NA       
10 dodge           11 NA       
# ... with 224 more rows
# i Use `print(n = ...)` to see more rows

這是另一個版本。 與上述類似,但使用 function rowid_to_column()

library(dplyr)

mpg %>% 
  arrange(cty) %>%
  select(manufacturer, cty) %>%
  rowid_to_column() %>%
  mutate(threshold = ifelse(rowid < 8, manufacturer, NA))

# A tibble: 234 x 4
   rowid manufacturer   cty threshold
   <int> <chr>        <int> <chr>    
 1     1 dodge            9 dodge    
 2     2 dodge            9 dodge    
 3     3 dodge            9 dodge    
 4     4 dodge            9 dodge    
 5     5 jeep             9 jeep     
 6     6 chevrolet       11 chevrolet
 7     7 chevrolet       11 chevrolet
 8     8 chevrolet       11 NA       
 9     9 dodge           11 NA       
10    10 dodge           11 NA       
# ... with 224 more rows
# i Use `print(n = ...)` to see more rows

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM