> dd <- tibble("Temper: 36.6℃ Pulse:76 bpm RR: 16bpm BP:148/58 mmHg")
> dd
# A tibble: 1 x 1
`"Temper: 36.6℃ Pulse:76 bpm RR: 16bpm BP:148/58 mmHg"`
<chr>
1 Temper: 36.6℃ Pulse:76 bpm RR: 16bpm BP:148/58 mmHg
> ddtarget <- tibble(Temper=36.6,Pulse=76,RR=16,SBP=148,DBP=58)
> ddtarget
# A tibble: 1 x 5
Temper Pulse RR SBP DBP
<dbl> <dbl> <dbl> <dbl> <dbl>
1 36.6 76 16 148 58我有一个dd,我想得到一个dd目标;我如何通过使用map或其他有趣的tidyverse来实现它呢?
发布于 2020-03-09 06:28:56
我们可以首先使用rename列(因为它的名字很奇怪),在空白上以不同的行分割数据,然后用大写字母获取数据,在冒号上得到不同列中的数据,最后使用pivot_wider获取宽格式的数据。
library(dplyr)
library(tidyr)
dd %>%
rename(col = `"Temper: 36.6℃ Pulse:76 bpm RR: 16bpm BP:148/58 mmHg"`) %>%
separate_rows(col, sep = "\\s+(?=[A-Z])") %>%
separate(col, into = c('name', 'value'), sep = ':|:') %>%
pivot_wider()
# A tibble: 1 x 4
# Temper Pulse RR BP
# <chr> <chr> <chr> <chr>
#1 " 36.6℃" 76 bpm " 16bpm" 148/58 mmHg发布于 2020-03-09 10:59:17
以下是一个混乱的解决方案:
# String to convert to tibble:
library(tidyverse)
dd <- tibble("Temper: 36.6℃ Pulse:76 bpm RR: 16bpm BP:148/58 mmHg")
# Store a vector of strings to become variables:
dd_vars <-
grep(":", unlist(lapply(strsplit(as.character(dd), "\\d+"),
function(w) {
x <- gsub(".* ", "", trimws(w, "both"))
y <- as.character(na.omit(ifelse(nchar(x) == 1, NA, x)))
})),
value = TRUE)
# Store a vector of the strings to become values:
dd_values <- iconv(gsub("[A-Za-z]", "", grep("\\d+", unlist(
lapply(strsplit(as.character(dd), ":"),
function(x) {
gsub(" .*", "", trimws(x, "both"))
})
),
value = TRUE)), 'utf-8', 'ascii', sub = '')
# Convert to a tibble with appropriate vectors:
tib <-
as_tibble(data.frame(lapply(within(setNames(
data.frame(t(
data.frame(vars = dd_vars,
values = as.character(dd_values))
),
stringsAsFactors = FALSE),
gsub(":", "", dd_vars)
)[-1, ],
{
SBP <- unlist(strsplit(BP, "/"))[1]
DBP <- unlist(strsplit(BP, "/"))[2]
rm(BP)
}), as.numeric)))https://stackoverflow.com/questions/60595176
复制相似问题