R 使用 For 循环从数字列 w/o 创建字符列

R Creating a Character Column from a Numeric Column w/o using For Loop

我正在尝试根据现有的数字列创建一列字符,最好不要使用 for 循环。我想出了多种方法来做到这一点,但我一直觉得我把它弄得比需要的复杂得多。

这是可怕且耗时的 for 循环版本 (已编辑)

joe <- as.data.frame(matrix(round(runif(10,1,5),0),nrow=10,ncol=1))
chr <- function(n) { rawToChar(as.raw(n)) }
m = ncol(joe)+1
for (i in 1:nrow(joe)){
  joe[i,m] <- chr(joe[i,m-1]+64)
}
joe

    V1 V2
1   2  B
2   1  A
3   3  C
4   2  B
5   1  A
6   3  C
7   2  B
8   5  E
9   3  C
10  4  D

是的。这样可行。不出所料。但是对于一个真实的数据集,这个操作会花费很长时间。

使用像 rawToChar 这样的 ASCII 转换函数如何?

joe <- as.data.frame(matrix(round(runif(10,1,5),0),nrow=10,ncol=1))
joe[,ncol(joe)+1] <- rawToChar(as.raw(64+joe[,1]))
joe

    V1        V2
1   1 ACCAACACDC
2   3 ACCAACACDC
3   3 ACCAACACDC
4   1 ACCAACACDC
5   1 ACCAACACDC
6   3 ACCAACACDC
7   1 ACCAACACDC
8   3 ACCAACACDC
9   4 ACCAACACDC
10  3 ACCAACACDC

那完全行不通。 rawToChar 的输出不是向量,而是字符串。有什么东西可以接受向量数字输入并输出字符列表吗?

稍微放弃这种方法后,我得到了另外两种工作方式...但它们不是特别优雅,需要相当多的代码行才能实现。首先查找 table 方法:

library("dplyr")
grades <- as.data.frame(matrix(seq(1,5,by=1),nrow=5,ncol=1))
grades <- cbind(grades, c("A","B","C","D","E"))
colnames(grades) <- c("num","ltr")
joe <- as.data.frame(matrix(round(runif(10,1,5),0)),nrow=10,ncol=1)
colnames(joe) <- c("num")
left_join(joe, grades, by="num")

    num ltr
1    3   C
2    4   D
3    2   B
4    5   E
5    4   D
6    2   B
7    2   B
8    1   A
9    5   E
10   2   B

现在使用因子和水平:

joe <- as.data.frame(matrix(round(runif(10,1,5),0)),nrow=10,ncol=1)
joe$V2 <- as.factor(joe$V1)
levels(joe$V2) <- c("A","B","C","D","E")
joe$V2 <- as.character(joe$V2)
joe

   V1 V2
1   4  D
2   1  A
3   3  C
4   2  B
5   3  C
6   3  C
7   5  E
8   2  B
9   4  D
10  4  D

所以我的问题真的是...还有其他我还没有想到的更简单、更优雅的方法吗?因为看起来我确实发明了一些非常复杂的方法来执行非常简单的操作。

提前感谢您的意见。

我不太确定你想做什么,但看看你的最后一个例子,你似乎想做这样的事情:

set.seed(123) # good practice for reproducible answer
joe <- data.frame( V1 = sample.int(5,10,replace=TRUE) ) # simpler way
joe$V2 <- LETTERS[joe$V1]
joe
#    V1 V2
# 1   2  B
# 2   4  D
# 3   3  C
# 4   5  E
# 5   5  E
# 6   1  A
# 7   3  C
# 8   5  E
# 9   3  C
# 10  3  C