Use the string of characters from a cell in a data

2019-09-18 23:26发布

问题:

>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"

now i want to create an object (vector) with the name "Experiment name : CONTROL DB AD_1" , or even better if possible CONTROL DB AD_1

Thank you

回答1:

Use assign:

varname <- "Experiment name : CONTROL DB AD_1"

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

And you can use a regular expression and sub or gsub to remove some text from a string:

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

But let me warn you this is an unusual thing to do.

Here be dragons.



回答2:

If I understand correctly, you have a bunch of CSV files, each with multiple experiments in them, named in the pattern "Experiment ...". You now want to read each of these "experiments" into R in an efficient way.

Here's a not-so-pretty (but not-so-ugly either) function that might get you started in the right direction.

What the function basically does is read in the CSV, identify the line numbers where each new experiment starts, grabs the names of the experiments, then does a loop to fill in a list with the separate data frames. It doesn't really bother making "R-friendly" names though, and I've decided to leave the output in a list, because as Andrie pointed out, "R has great tools for working with lists."

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
}

Here is an example CSV file. Copy and paste it into a text editor and save it as "funkyfile1.csv" in the current working directory. (Or, read it in from 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

Here is a second CSV. Again, copy-paste and save it as "funkyfile2.csv" in your current working directory. (Or, read it in from 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

Notice that funkyfile1 has no column names, while funkyfile2 does. That's what the ... argument in the function is for: to specify header=TRUE or header=FALSE. Also the "expression" identifying each new set of data is "Promises" in funkyfile2.

Now, use the function:

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

Go get those dragons.

Update

If your data are all in the same format, you can use the lapply solution mentioned by Andrie along with this function. Just make a list of the CSVs that you want to load, as below. Note that the files all need to use the same "expression" and other arguments the way the function is currently written....

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)