首页 > 解决方案 > 有没有办法在 R 中存储具有数字/文本值的列?

问题描述

列大小具有以下值:“70”“S”“M”“L”“X”“60”“62”“46”“50”“54”“46”“50”“54”“60”[ 31]“NA”“50”“54”“58”“62”“44”“50”“54”“58”“44”“40”“

我正在尝试在 R 中创建一个桶列表,使“X”中的任何尺寸为 70 或更大,“L”中的任何尺寸 >= 60 和 <70,“M”中的任何尺寸 >= 50 和 <60,以及 >=40 中的任何尺寸“S”。我是 R 新手,所以我对如何做到这一点感到困惑。我有一个列名大小,其中包含此信息。这很难,因为我知道在 R 中,列只能具有数据类型。我将列大小更改为数字,但随后松开了我已有的文本值。有人能帮我吗?这是我正在使用的代码:

for (i in 1:nrow(C02E02)) {
Xb <- C02E02[i,9]
Lb <- C02E02[1,9]

if (Xb >= "70"){
laXb <-Xb
}else {
C02E02[i,9] <- c("X")
}

if (Lb >= 60 & Lb<70){
laLb <-Lb
}else {
C02E02[i,9] <- c("L")
}

}

在此处输入图像描述

标签: r

解决方案


您可以获取只有数字的所有值的索引,将它们转换为数字并用于cut将它们分成不同的组并为它们分配标签。

y <- x
inds <- grep('^\\d+$', y)
y[inds] <- as.character(cut(as.numeric(y[inds]), 
           c(0, 50, 60, 70, Inf), c('S', 'M', 'L', 'X'), right = FALSE))
y

# [1] "X"  "S"  "M"  "L"  "X"  "L"  "L"  "S"  "M"  "M"  "S"  "M"  "M"  "L"  "NA"
#[16] "M"  "M"  "M"  "L"  "S"  "M"  "M"  "M"  "S"  "S" 

为您的数据替换xC02E02$Size.

数据

x <- c("70", "S", "M", "L", "X", "60", "62", "46", "50", "54", "46", 
"50", "54", "60", "NA", "50", "54", "58", "62", "44", "50", "54", 
"58", "44", "40")

推荐阅读