[英]How To Split A Range Factor Into List Of Numbers In R
我在格式735-739
的數據框中有一個因子變量。
我想將此作為三個數字列(min, mean, max)
到我的數據框中。
我首先使用strsplit
:
values = sapply(range, function(r) {
values = c(strsplit(as.character(r), "-"))
})
我得到一個長度為1的類list
的值:
[1] "735" "739"
我不知道下一步應該做什么。 我會很高興的提示。
有幾種方法可以做到這一點。 這是我的“ splitstackshape”包中以concat.split.multiple
開頭的一個:
## SAMPLE DATA
mydf <- data.frame(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220"))
mydf
# ID vals
# 1 A 700-800
# 2 B 600-750
# 3 C 100-220
首先,拆分“丘壑”一欄,如果(使用需要重命名這些setnames
),並與添加新列rowMeans
。
library(splitstackshape)
mydf <- concat.split.multiple(mydf, "vals", "-")
setnames(mydf, c("vals_1", "vals_2"), c("min", "max"))
mydf$mean <- rowMeans(mydf[c("min", "max")])
mydf
# ID min max mean
# 1 A 700 800 750
# 2 B 600 750 675
# 3 C 100 220 160
供參考,這是一種更“手工”的方法:
mydf <- data.frame(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220"))
SplitVals <- sapply(sapply(mydf$vals, function(x)
strsplit(as.character(x), "-")), function(x) {
x <- as.numeric(x)
c(min = x[1], mean = mean(x), max = x[2])
})
cbind(mydf, t(SplitVals))
# ID vals min mean max
# 1 A 700-800 700 750 800
# 2 B 600-750 600 675 750
# 3 C 100-220 100 160 220
使用@AnandraMahto的數據集,您還可以使用data.table
庫-
library(data.table)
dt <- data.table(ID = LETTERS[1:3], vals = c("700-800", "600-750", "100-220"))
# adding the min and max columns
splitlist <- strsplit(dt[,vals],"-")
dt[, minv := as.numeric(sapply(X = splitlist, function(x) x[1]))]
dt[, maxv := as.numeric(sapply(X = splitlist, function(x) x[2]))]
#adding mean
dt[,meanv := mean(minv:maxv), by = "vals"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.