【问题标题】:Copy data in a column and paste in a line of syntax复制一列中的数据并粘贴到一行语法中
【发布时间】:2014-11-07 04:24:42
【问题描述】:

我参加了 coursera 的视频讲座。我得到了一张这样的工资数据表。

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 条数据是不可能的。你能告诉我如何在不手动输入的情况下复制一大堆数据吗?

【问题讨论】:

标签: r text


【解决方案1】:

您只需使用即可获得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"))

【讨论】:

  • 很好很透彻的解释!您可能会添加的一件小事是 [. (+1)
  • 非常感谢,大卫!最精彩的是代码 [boxplot(eval(parse(text=as.character(data02))))] 然后我在绘图或其他计算中不需要复制大块数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多