我正在尝试使用下面的代码将“ 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)
答案 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”的行。
这些是快速而肮脏的正则表达式语句。我敢肯定,更清洁的配方有可能获得相同的结果。