在一列中分别分离百万和十亿数据

时间:2018-10-26 10:34:37

标签: r

我正在尝试使用下面的代码将“ M”和“ B”及其值分隔在2个不同的列中。

我想要这样的输出:

level 1    level 2
M 3.2      B 3.6
M 4        B 2.8
           B 3.5

输入:

reve=c("M 3.2","B 3.6","B 2.8","B 3.5","M 4")
#class(reve)
data=data.frame(reve)

这是我尝试过的。

index=which(grepl("M ",data$reve)
data$reve=gsub("M ","",data$reve)
data$reve=gsub("B ","",data$reve)

data$reve=as.numeric(data$reve)

4 个答案:

答案 0 :(得分:1)

如果您有数据框,则可以使用dplyr separate()

我给你举个例子:

library(dplyr)
df <- tibble(coupe = c("M 2.3", "M 4.5", "B 1"))
df %>% separate(coupe, c("MorB","Quant"), " ")

输出

#  MorB  Quant
#  <chr> <chr>
#1 M     2.3  
#2 M     4.5  
#3 B     1    

希望它对您有帮助!

用于计算“ M”行的数量:

 df %>% separate(YourColumn, c("MorB","Quant"), " ") %>% 
 filter(MorB == "M") %>% nrow() 

答案 1 :(得分:0)

这是一种base R的方法。

lst <- split(reve, substr(reve, 1, 1))
df1 <- as.data.frame(lapply(lst, `length<-`, max(lengths(lst))))
df1
#      B     M
#1 B 3.6 M 3.2
#2 B 2.8   M 4
#3 B 3.5  <NA>

split将向量按第一个字母一分为二。这会为您提供一个列表,其中包含不等长的条目。使用lapply来使条目具有相同的长度,即在较短的条目后面附加NA。致电as.data.frame

如果要更改名称,可以使用setNames

setNames(df1, c("level_2", "level_1"))

万一我误解了您想要的输出,请尝试

df1 <- data.frame(do.call(rbind, (strsplit(reve, " "))), stringsAsFactors = FALSE)
df1[] <- lapply(df1, type.convert, as.is = TRUE)
df1
#  X1  X2
#1  M 3.2
#2  B 3.6
#3  B 2.8
#4  B 3.5
#5  M 4.0

答案 2 :(得分:0)

我们可以算出 Millions Billions 如下:

输入数据集:

reve=c("M 3.2","B 3.6","B 2.8","B 3.5","M 4")
data=data.frame(reve)

代码

library(dplyr)
library(tidyr)
data %>% 
  separate(reve, c("Label", "Value"),extra = "merge") %>%
  group_by(Label) %>% 
  summarise(n = n())

输出

# A tibble: 2 x 2
 Label     n
  <chr> <int>
 1 B         3
 2 M         2

答案 3 :(得分:0)

我认为植根于正则表达式的选项也可能有助于解决这类问题

 reve=c("M 3.2","B 3.6","B 2.8","B 3.5","M 4")

 data=data.frame(reve, stringsAsFactors = F) # handle your data as strings, not factors

 # regex to extract M vals and B vals
 mvals <- stringi::stri_extract_all_regex(data, "M+\\s[0-9]\\.[0-9]|M+\\s[0-9]")[[1]]
 bvals <- stringi::stri_extract_all_regex(data, "B+\\s[0-9]\\.[0-9]|B+\\s[0-9]")[[1]]

 # gluing things together into a single df
 len <- max(length(mvals), length(bvals)) # find the length
 data.frame(M = c(mvals, rep(NA, len - length(mvals))) # ensure vectors are the same size
           ,B = c(bvals, rep(NA, len - length(bvals)))) # ensure vectors are the same size

如果不熟悉正则表达式,则第一个表达式搜索“ M”,后跟一个空格,然后是数字0到9,然后是一个句点,然后是数字0到9。垂直管道位于“或”运算符上,因此表达式还会搜索“ M”,后跟一个空格,然后是数字0到9。表达式的后半部分说明了类似“ M 4”的情况。第二个表达式做同样的事情,只是对于包含“ B”而不是“ M”的行。

这些是快速而肮脏的正则表达式语句。我敢肯定,更清洁的配方有可能获得相同的结果。