我参加了课程的视频讲座。我得到了一份这样的工资数据表。
data02 = read.table("~/R/introstats/NYRedBullsSalaries.txt", header = F)
表格如下:
V1
1 33750.00
2 44000.00
3 138188.00
4 45566.67
5 44000.00
我想将V1中的所有数据复制到一行,保留格式为数字。我键入了这样的语法:
salaries = paste(as.character(data02), sep = " ", collapse =",")
salaries
它有效。
# [1] "c(33750, 44000, 138188, 45566.67, 44000)"
但是当我想制作一个盒子图时,它失败了:
boxplot(salaries)
## Error in x[floor(d)] + x[ceiling(d)]
二元运算符的非数字参数
我只能通过手动复制一堆数字来实现:
salaries_revised = c(33750, 44000, 138188, 45566.67, 44000)
boxplot(salaries_revised)
问题:
如果我处理5个数据就可以了。但是,突出和复制5,000个数据是不可能的。你能告诉我如何在没有人工输入的情况下复制大量数据吗?
答案 0 :(得分:2)
只需使用
即可获得boxplot
boxplot(data02) #it will give a boxplot for each column
从帖子中,我假设你想模仿使用
生成的输出salaries_revised = c(33750, 44000, 138188, 45566.67, 44000)
str(salaries_revised)
#num [1:5] 33750 44000 138188 45567 44000
您无需手动复制元素即可获得boxplot
输入数据集的正确格式。只是做:
salaries_revised <- data02[,"V1"]
或者
salaries_revised <- data02$V1
str(salaries_revised)
# num [1:5] 33750 44000 138188 45567 44000
关于您使用的paste
代码,它创建了一个字符string
salaries <- paste(as.character(data02), sep = " ", collapse =",")
str(salaries)
# chr "c(33750, 44000, 138188, 45566.67, 44000)"
获得所需结果的一种方法是使用eval(parse(..
boxplot(eval(parse(text=salaries)))
您甚至不需要paste
来获取上述字符串
as.character(data02)
#[1] "c(33750, 44000, 138188, 45566.67, 44000)"
boxplot(eval(parse(text=as.character(data02))))
此外,您使用data.frame
作为paste
。假设,您的数据集有多列。
data03 <- data02
data03$V2 <- 1:5
as.character(data03)
#[1] "c(33750, 44000, 138188, 45566.67, 44000)"
#[2] "1:5"
直接在上面的eval(parse(..)
将只返回最后一个元素
eval(parse(text=as.character(data03)))
#[1] 1 2 3 4 5
使用paste
salaries <- paste(as.character(data03), sep = " ", collapse =",")
salaries
#[1] "c(33750, 44000, 138188, 45566.67, 44000),1:5"
最终会出错。
boxplot(eval(parse(text=salaries)))
#Error in parse(text = salaries) : <text>:1:41: unexpected ','
如果您只需要V1
列
salaries <- paste(as.character(data03[,"V1", drop=FALSE]),
sep = " ", collapse =",")
默认情况下,当您尝试从数据集中对单个列进行子集时,它会转换为vector
。因此,您可以通过指定drop=FALSE
来避免这种情况。
或者
salaries <- paste0("c(",paste(as.character(data03[,"V1"]),
sep=" ", collapse=","), ")")
salaries
#[1] "c(33750,44000,138188,45566.67,44000)"
data02 <- structure(list(V1 = c(33750, 44000, 138188, 45566.67, 44000)),
.Names = "V1", class = "data.frame", row.names = c("1", "2", "3", "4", "5"))