Question

I have a data.frame:

df<-data.frame(a=c("x","x","y","y"),b=c(1,2,3,4))

> df
      a b
    1 x 1
    2 x 2
    3 y 3
    4 y 4

What's the easiest way to print out each pair of values as a list of strings like this:

"x1", "x2", "y1", "y2"

Was it helpful?

Solution

apply(df, 1, paste, collapse="")

OTHER TIPS

with(df, paste(a, b, sep=""))

And this should be faster than apply.

About timing

For 10000 rows we get:

df <- data.frame(
    a = sample(c("x","y"), 10000, replace=TRUE),
    b = sample(1L:4L, 10000, replace=TRUE)
)

N = 100
mean(replicate(N, system.time( with(df, paste(a, b, sep="")) )["elapsed"]), trim=0.05)
# 0.005778
mean(replicate(N, system.time( apply(df, 1, paste, collapse="") )["elapsed"]), trim=0.05)
# 0.09611

So increase in speed is visible for few thousands.
It's because Shane's solution call paste for each row separately. So there is nrow(df) calls of paste, in my solution is one call.

Also, you can use sqldf library:

library("sqldf")
df<-data.frame(a=c("x","x","y","y"),b=c(1,2,3,4))
result <- sqldf("SELECT a || cast(cast(b as integer) as text) as concat FROM df")

You will get the following result:

  concat
1 x1
2 x2
3 y3
4 y4
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top