-1

I have a list, mm:

 head(mm)
[[1]]
[1] "8  1901 - 1908  >>Primus<< sbk"

[[2]]
[1] "12  1901 - 1912  A & B:s skofabriks arbetares sbk."

[[3]]
[1] "5  1907 - 1911  A. B. Elevators arberates sbk"

[[4]]
[1] "5  1901 - 1905  Abk. N.K.B. (Nya Klöfverbladet)"

[[5]]
[1] "2  1904 - 1905  absolutisternas sbk"

[[6]]
[1] "12  1901 - 1912  Aftonbladets personals sbk"


length(mm)
[1] 429

dput(head(mm))
list("8  1901 - 1908  >>Primus<< sbk", "12  1901 - 1912  A & B:s skofabriks arbetares sbk.", 
    "5  1907 - 1911  A. B. Elevators arberates sbk", "5  1901 - 1905  Abk. N.K.B. (Nya Klöfverbladet)", 
    "2  1904 - 1905  absolutisternas sbk", "12  1901 - 1912  Aftonbladets personals sbk")

I also have company names:

head(unique(data$Name))
[1] ">>Primus<< sbk"                    "A & B:s skofabriks arbetares sbk." "A. B. Elevators arberates sbk"    
[4] "Abk. N.K.B. (Nya Klöfverbladet)"   "absolutisternas sbk"               "Aftonbladets personals sbk"

length(unique(data$Name))
[1] 429

I am trying to make a new list, where each element om mm list is repeated number of times each company occurs in my data frame:

data[1:20,1:2]
     Year                              Name
1    1901                    >>Primus<< sbk
185  1902                    >>Primus<< sbk
382  1903                    >>Primus<< sbk
597  1904                    >>Primus<< sbk
822  1905                    >>Primus<< sbk
1059 1906                    >>Primus<< sbk
1310 1907                    >>Primus<< sbk
1567 1908                    >>Primus<< sbk
2    1901 A & B:s skofabriks arbetares sbk.
186  1902 A & B:s skofabriks arbetares sbk.
383  1903 A & B:s skofabriks arbetares sbk.
598  1904 A & B:s skofabriks arbetares sbk.
823  1905 A & B:s skofabriks arbetares sbk.
1060 1906 A & B:s skofabriks arbetares sbk.
1311 1907 A & B:s skofabriks arbetares sbk.
1568 1908 A & B:s skofabriks arbetares sbk.
1827 1909 A & B:s skofabriks arbetares sbk.
2090 1910 A & B:s skofabriks arbetares sbk.
2355 1911 A & B:s skofabriks arbetares sbk.
2602 1912 A & B:s skofabriks arbetares sbk.

dput(data[1:20,1:2])
structure(list(Year = c(1901L, 1902L, 1903L, 1904L, 1905L, 1906L, 
1907L, 1908L, 1901L, 1902L, 1903L, 1904L, 1905L, 1906L, 1907L, 
1908L, 1909L, 1910L, 1911L, 1912L), Name = c(">>Primus<< sbk", 
">>Primus<< sbk", ">>Primus<< sbk", ">>Primus<< sbk", ">>Primus<< sbk", 
">>Primus<< sbk", ">>Primus<< sbk", ">>Primus<< sbk", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.", "A & B:s skofabriks arbetares sbk.", 
"A & B:s skofabriks arbetares sbk.")), .Names = c("Year", "Name"
), row.names = c(1L, 185L, 382L, 597L, 822L, 1059L, 1310L, 1567L, 
2L, 186L, 383L, 598L, 823L, 1060L, 1311L, 1568L, 1827L, 2090L, 
2355L, 2602L), class = "data.frame")

So for example ´mm[[1]]´ would be repeated 8 times because company >>Primus<< sbk occurs 8 times :

length(data[data$Name==">>Primus<< sbk",2])
[1] 8

My approach is:

mm=lapply(1:length(maxz),function(x) paste(diffz[[x]]+1,"",minz[[x]],"-",maxz[[x]],"",names(maxz)[[x]]))

hb=lapply(seq_along(mm),function(x,m) rep(mm[[x]],length(data[data$Name==m,2])),m=unique(data$Name))

But I get this warning after running hb above:

There were 50 or more warnings (use warnings() to see the first 50)

head(warnings())
$`longer object length is not a multiple of shorter object length`
data$Name == m

$`longer object length is not a multiple of shorter object length`
data$Name == m

What am I doing wrong?:(

EDIT:

Here is a workaround that works:

Best Regards!

mm=lapply(1:length(maxz),function(x) paste(diffz[[x]]+1,"",minz[[x]],"-",maxz[[x]],"",names(maxz)[[x]]))

names(mm)=names(minz)

hb=lapply(names(mm),function(x) rep(mm[[x]],length(data[data$Name==x,2])))

where

head(names(minz))
[1] ">>Primus<< sbk"                    "A & B:s skofabriks arbetares sbk." "A. B. Elevators arberates sbk"    
[4] "Abk. N.K.B. (Nya Klöfverbladet)"   "absolutisternas sbk"               "Aftonbladets personals sbk" 
user1665355
  • 3,324
  • 8
  • 44
  • 84
  • 1
    the first thing you're doing wrong is not providing a reproducible example ;) [please read this and edit your question](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Anthony Damico Feb 05 '13 at 11:17
  • 1
    The second thing you are doing wrong is to confuse a `warning` with an `error`. R issued a warning, not an error. – Andrie Feb 05 '13 at 11:18
  • @Andrie Sorry, `dput` is present now. I wrote wrong, I meant warning:) – user1665355 Feb 05 '13 at 11:19
  • I don't get a warning with your example dataset. – Sven Hohenstein Feb 05 '13 at 11:30
  • @Sven Hohenstein That's strange. I found a workaround Sven, look at Edit. But I really want to try to understand why my first solution doesn't work for me... – user1665355 Feb 05 '13 at 12:11

1 Answers1

3

You'll find life much easier if you work with the standard data structure for storing data in R: the data.frame. The following code converts your input into a data frame, and then uses subsetting to repeat the rows.

mm <- list("8  1901 - 1908  >>Primus<< sbk", "12  1901 - 1912  A & B:s skofabriks arbetares sbk.", 
    "5  1907 - 1911  A. B. Elevators arberates sbk", "5  1901 - 1905  Abk. N.K.B. (Nya Klöfverbladet)", 
    "2  1904 - 1905  absolutisternas sbk", "12  1901 - 1912  Aftonbladets personals sbk")

# Convert to a character vector
m <- unlist(mm)

# Convert multiple character separator to single
m2 <- gsub(" {2, }", ",", m)

# Parse with read.csv
df <- read.csv(text = m2, header = false)
names(df) <- c("n", "years", "company")

# Finally, duplicate each row
df[rep(1:nrow(df), df$n), -1]
hadley
  • 102,019
  • 32
  • 183
  • 245
  • Thanks! A nice solution. The thing is that I put hb (in my question) as a column into my data frame. So the reason is that I want hb to be a vector:) But well, I could always paste the columns together. – user1665355 Feb 05 '13 at 15:22