当我将因子转换为数字或整数时,我得到基础级别代码,而不是值作为数字.
f <- factor(sample(runif(5), 20, replace = TRUE))
## [1] 0.0248644019011408 0.0248644019011408 0.179684827337041
## [4] 0.0284090070053935 0.363644931698218 0.363644931698218
## [7] 0.179684827337041 0.249704354675487 0.249704354675487
## [10] 0.0248644019011408 0.249704354675487 0.0284090070053935
## [13] 0.179684827337041 0.0248644019011408 0.179684827337041
## [16] 0.363644931698218 0.249704354675487 0.363644931698218
## [19] 0.179684827337041 0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218
as.numeric(f)
## [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2
as.integer(f)
## [1] 1 1 3 2 5 …
Run Code Online (Sandbox Code Playgroud) What is the quickest/best way to change a large number of columns to numeric from factor?
I used the following code but it appears to have re-ordered my data.
> head(stats[,1:2])
rk team
1 1 Washington Capitals*
2 2 San Jose Sharks*
3 3 Chicago Blackhawks*
4 4 Phoenix Coyotes*
5 5 New Jersey Devils*
6 6 Vancouver Canucks*
for(i in c(1,3:ncol(stats))) {
stats[,i] <- as.numeric(stats[,i])
}
> head(stats[,1:2])
rk team
1 2 Washington Capitals*
2 13 San Jose Sharks* …
Run Code Online (Sandbox Code Playgroud) 我有一个data.table,我希望在某些列上执行相同的操作.这些列的名称以字符向量给出.在这个特定的例子中,我想将所有这些列乘以-1.
一些玩具数据和指定相关列的向量:
library(data.table)
dt <- data.table(a = 1:3, b = 1:3, d = 1:3)
cols <- c("a", "b")
Run Code Online (Sandbox Code Playgroud)
现在我这样做,循环遍历字符向量:
for (col in 1:length(cols)) {
dt[ , eval(parse(text = paste0(cols[col], ":=-1*", cols[col])))]
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有for循环的情况下直接执行此操作?
R通常以"错误"格式理解数据框列,或者您只需要将列类从因子更改为字符以进行修改.我以前用以下方式更改了列类:
set.seed(1)
df <- data.frame(x = 1:10,
y = rep(1:2, 5),
k = rnorm(10, 5,2),
z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
j = c(rep(c("a", "b", "c"), 3), "d"))
x <- c("y", "z")
for(i in 1:length(x)){
df[,x[i]] <- factor(df[,x[i]])}
Run Code Online (Sandbox Code Playgroud)
并回到数字:
x <- 1:5
for(i in 1:length(x)){
df[,x[i]] <- as.numeric(as.character(df[,x[i]]))} # Character cannot become numeric
Run Code Online (Sandbox Code Playgroud)
在我看来,也许有更好的方法做到这一点.我发现了这个问题,这正是我所需要的:
convert.magic <- function(obj,types){
out <- lapply(1:length(obj),FUN = function(i){FUN1 <-
switch(types[i],
character = as.character,
numeric = as.numeric,
factor = as.factor); FUN1(obj[,i])})
names(out) <- …
Run Code Online (Sandbox Code Playgroud) 我需要更改整个data.frame的列类。理想情况是寻找apply
解决方案,但tidyverse
也欢迎其他解决方案。
示例数据
set.seed(1)
d <- data.frame("numbers" = as.character(1:10),
"letters" = letters[1:10],
"boolean" = sample(c("T", "F"), 10, T),
stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)
我想制作第一列(numbers
)numeric
,第二列(letters
)character
和第三列(boolean
)logical
。
我有很多专栏文章。我不想一一更改。比方说,tible看起来像这样:
df <- tibble(
x = c(1,0,1,1,'a'),
y = c('A', 'B', 1, 'D', 'A'),
z = c(1/3, 4, 5/7, 100, 3)
)
Run Code Online (Sandbox Code Playgroud)
我想根据其他标题中的值转换其列类型:
df_map <- tibble(
col = c('x','y','z'),
col_type = c('integer', 'string', 'float')
)
Run Code Online (Sandbox Code Playgroud)
什么是最合适的解决方案?
我在大数据集中有一个数据子集,它不符合数据读入R时分配的原始数据类型.如何重新转换数据子集的数据类型,就像R只做R一样那个子集被读了?
示例:假设存在一个由变量1-4(v1到v4)组成的数据堆栈和一个以列名v5到v8开头的不同数据集.
V1 V2 V3 V4
1 32 a 11 a
2 12 b 32 b
3 3 c 42 c
4 v5 v6 v7 v8
5 a 43 a 35
6 b 33 b 64
7 c 55 c 32
Run Code Online (Sandbox Code Playgroud)
如果我使用v5-v8创建一个新的df,如何自动将整个数据"重新转换"为适当的类型?(就像我要重新读取csv中的数据一样,R会这么做)