复制字符串直到R Dataframe中的某个点

时间:2018-05-17 11:28:37

标签: r dataframe tidyverse

我目前有以下数据框:

Country Information Export Import
Andorra Small       10     20  
        Medium      50     30  
        Large       40     50  
Total   NA          100    100     
Antigua Small       60     70
        Medium      20     10
        Large       5      10
        X-Large     15     10  
Total   NA          100    100    

我想重复国家名称,直到它到达字符串" Total",所以我会让安道尔在名为$ Country的列中重复行,直到它到达行#34 ;总"

正如你所看到的几乎每个国家的行都有所不同(我有252个)所以我需要找到一种方法来确保国家名称在特定国家/地区重复,直到达到"总计&# 34;

(例如,安提瓜有4行,而不是像安道尔一样 - 所以要求安提瓜在$ Country栏中重复4次)

有快速有效的方法吗?

感谢任何帮助。

谢谢

2 个答案:

答案 0 :(得分:2)

我假设您在NA值缺失的情况下拥有country值而非空值。

您需要使用包na.locf中的功能zoo并将其应用到country列,如下所示:

library(zoo)

# example of column values
country = c("Andorra",NA,NA,"Total","Antigua",NA,NA,NA,"Total")

# apply fucntion and update your variable
country = na.locf(country)

# see updated values
country
# [1] "Andorra" "Andorra" "Andorra" "Total"   "Antigua" "Antigua" "Antigua" "Antigua" "Total" 

它的作用是将NA值替换为之前的非NA值。

答案 1 :(得分:1)

我会使用tidyr包中的fill函数

输入数据

df <- data.table::fread("Country    Information Export  Import
Andorra Small   10  20
NA  Medium  50  30
NA  Large   40  50
Total   NA  100 100
Antigua Small   60  70
NA  Medium  20  10
NA  Large   5   10
NA  X-Large 15  10
Total   NA  100 100")

使用tidyr填充

填写缺失信息的代码
library(tidyr)
fill(df, Country, .direction = "down")

<强>输出

   Country Information Export Import
1: Andorra       Small     10     20
2: Andorra      Medium     50     30
3: Andorra       Large     40     50
4:   Total        <NA>    100    100
5: Antigua       Small     60     70
6: Antigua      Medium     20     10
7: Antigua       Large      5     10
8: Antigua     X-Large     15     10
9:   Total        <NA>    100    100

如果长度为零的字符串值而不是NA,则可以使用na_if包中的dplyr函数将其更改为NA

library(dplyr)

df %>% 
  mutate(Country = na_if(Country,"")) %>% 
  fill(Country, .direction = "down")