【问题标题】:Use the string of characters from a cell in a dataframe to create a vector使用数据框中单元格中的字符串创建向量
【发布时间】:2012-07-17 15:16:05
【问题描述】:
>titletool<-read.csv("TotalCSVData.csv",header=FALSE,sep=",")

> class(titletool)
[1] "data.frame"

>titletool[1,1]
[1] Experiment name : CONTROL DB AD_1

>t<-titletool[1,1]

>t
[1] Experiment name : CONTROL DB AD_1

>class(t)
[1] "character"

现在我想创建一个名为“Experiment name : CONTROL DB AD_1”的对象(向量),或者如果可能的话更好的是 CONTROL DB AD_1

谢谢

【问题讨论】:

  • 向量的内容是什么?你是什​​么意思向量有那个“名字”? (一个向量可以有多个名称,每个值一个)。

标签: r vector dataframe


【解决方案1】:

使用assign:

varname <- "Experiment name : CONTROL DB AD_1"

assign(varname, 3.14158)
get("Experiment name : CONTROL DB AD_1")
[1] 3.14158

您可以使用正则表达式和subgsub 从字符串中删除一些文本:

cleanVarname <- sub("Experiment name : ", "", varname)
assign(cleanVarname, 42)
get("CONTROL DB AD_1")
[1] 42

但是让我警告你这是一件不寻常的事情。

这里有龙。

【讨论】:

  • 您好,谢谢您的回答安德烈,我要做的是无需输入“实验名称:CONTROL DB AD_1”我有 30 个包含我想要的数据的 csv 文件放入易于使用的格式。所有信息都已经在 csv 文件中,所以我想使用其中的内容,所以我不必通过每个文件来检查它的样本。以后我可能会有更多这些 csv 来分析,这样我可能会节省很多时间(我希望)
  • 这真是个坏主意。只是不要那样做。请改用命名列表。在lapply() 中使用read.csv() 创建一个data.frames 列表。 R 有很好的工具来处理列表。
  • @Andrie,我想同时成为一个读心者和slay dragons。我认为 OP 可能在每个 CSV 文件中有多个“实验”,否则我不知道为什么 CSV 名称会与实验名称不同。
【解决方案2】:

如果我理解正确,您有一堆 CSV 文件,每个文件中都有多个实验,以“实验 ...”模式命名。您现在想以一种有效的方式将这些“实验”中的每一个读入 R。

这是一个不那么漂亮(但也不那么丑)的函数,它可能会让你朝着正确的方向开始。

该函数的基本作用是读取 CSV,识别每个新实验开始的行号,获取实验的名称,然后执行循环以使用单独的数据框填充列表。不过,命名“R 友好”并没有真正麻烦,我决定将输出保留在一个列表中,因为正如 Andrie 指出的那样,“R 有很好的工具来处理列表。”

read.funkyfile = function(funkyfile, expression, ...) {
  temp = readLines(funkyfile)
  temp.loc = grep(expression, temp)
  temp.loc = c(temp.loc, length(temp)+1)
  temp.nam = gsub("[[:punct:]]", "", 
                  grep(expression, temp, value=TRUE))
  temp.out = vector("list")

  for (i in 1:length(temp.nam)) {
    temp.out[[i]] = read.csv(textConnection(
                             temp[seq(from = temp.loc[i]+1,
                             to = temp.loc[i+1]-1)]),
                             ...)
    names(temp.out)[i] = temp.nam[i]
  }
  temp.out
}

这是一个示例 CSV 文件。将其复制并粘贴到文本编辑器中,并将其保存为当前工作目录中的“funkyfile1.csv”。 (或者,从 Dropbox 中读入:http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv

"Experiment Name: Here Be",,
1,2,3
4,5,6
7,8,9
"Experiment Name: The Dragons",,
10,11,12
13,14,15
16,17,18

这是第二个 CSV。同样,复制粘贴并将其另存为“funkyfile2.csv”在您当前的工作目录中。 (或者,从 Dropbox 中读入:http://dl.dropbox.com/u/2556524/testing/funkyfile2.csv

"Promises: I vow to",,
"H1","H2","H3"
19,20,21
22,23,24
25,26,27
"Promises: Slay the dragon",,
"H1","H2","H3"
28,29,30
31,32,33
34,35,36

注意funkyfile1 没有列名,而funkyfile2 有。这就是函数中的... 参数的用途:指定header=TRUEheader=FALSE。此外,标识每组新数据的“表达式”是funkyfile2 中的“Promises”。

现在,使用函数:

read.funkyfile("funkyfile1.csv", "Experiment", header=FALSE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv",
#                "Experiment", header=FALSE) # Uncomment to load remotely
# $`Experiment Name Here Be`
# V1 V2 V3
# 1  1  2  3
# 2  4  5  6
# 3  7  8  9
# 
# $`Experiment Name The Dragons`
# V1 V2 V3
# 1 10 11 12
# 2 13 14 15
# 3 16 17 18

read.funkyfile("funkyfile2.csv", "Promises", header=TRUE)
# read.funkyfile("http://dl.dropbox.com/u/2556524/testing/funkyfile2.csv",
#                "Experiment", header=TRUE) # Uncomment to load remotely
# $`Promises I vow to`
# H1 H2 H3
# 1 19 20 21
# 2 22 23 24
# 3 25 26 27
# 
# $`Promises Slay the dragon`
# H1 H2 H3
# 1 28 29 30
# 2 31 32 33
# 3 34 35 36

去拿那些龙。

更新

如果你的数据都是相同的格式,你可以配合这个函数使用Andrie提到的lapply解决方案。只需列出您要加载的 CSV,如下所示。请注意,文件都需要使用与当前编写函数的方式相同的“表达式”和其他参数....

temp = list("http://dl.dropbox.com/u/2556524/testing/funkyfile1.csv", 
            "http://dl.dropbox.com/u/2556524/testing/funkyfile3.csv")
lapply(temp, read.funkyfile, "Experiment", header=FALSE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    相关资源
    最近更新 更多