这是一个基本问题,我很尴尬地问。
我们假设我的数据框中包含以下格式的数据:
test <-"3000,9843,9291,2161,3458,2347,22925,55836,2890,2824,2848,2805,2808,2775,2760,2706,2727,2688,2727,2658,2654,2588"
我想将其转换为数字向量,我这样做了:
test <- as.numeric(unlist(strsplit(test, split=",")))
我现在想要将包含完整此数据的列的大型数据帧转换为等效的数字向量:
mutate(data,
converted = as.numeric(unlist(strsplit(badColumn, split=","))),
)
这不起作用,因为可能是因为它将整个列转换为数字向量,然后用该值替换单行:
mutate_impl(.data,dots)中的错误:列
converted
必须是 长度20(行数)或1,而不是1274
我该怎么做?
答案 0 :(得分:2)
这可能会有所帮助:
library(purrr)
mutate(data, converted = map(badColumn, function(txt) as.numeric(unlist(strsplit(txt, split = ",")))))
你得到的是一个包含数字向量的列表列。
答案 1 :(得分:1)
基础R
A=c(as.numeric(strsplit(test,',')[[1]]))
A
[1] 3000 9843 9291 2161 3458 2347 22925 55836 2890 2824 2848 2805 2808 2775 2760 2706 2727 2688 2727 2658 2654 2588
df$NEw2=lapply(df$NEw, function(x) c(as.numeric(strsplit(x,',')[[1]])))
df%>%mutate(NEw2=list(c(as.numeric(strsplit(NEw,',')[[1]]))))
答案 2 :(得分:1)
以下是重现错误的一些示例数据:
data <- data.frame(a = 1:3,
badColumn = c("10,20,30,40,50", "1,2,3,4,5,6", "9,8,7,6,5,4,3"),
stringsAsFactors = FALSE)
这是错误:
library(tidyverse)
mutate(data, converted = as.numeric(unlist(strsplit(badColumn, split=","))))
# Error in mutate_impl(.data, dots) :
# Column `converted` must be length 3 (the number of rows) or one, not 18
直接的方法是在整个列上使用strsplit
,并lapply
... as.numeric
将结果列表值从字符向量转换为数字向量。
x <- mutate(data, converted = lapply(strsplit(badColumn, ",", TRUE), as.numeric))
str(x)
# 'data.frame': 3 obs. of 3 variables:
# $ a : int 1 2 3
# $ badColumn: chr "10,20,30,40,50" "1,2,3,4,5,6" "9,8,7,6,5,4,3"
# $ converted:List of 3
# ..$ : num 10 20 30 40 50
# ..$ : num 1 2 3 4 5 6
# ..$ : num 9 8 7 6 5 4 3