Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set multiple columns in a data table to values from different columns in the same data table?

Tags:

r

data.table

Suppose I have a data frame with 6 columns, and I want to set col 1:3 to the values in col 4:6 (this comes up a lot when merging). With data frames it's easy:

set.seed(1)
df <- data.frame(matrix(sample(1:100,30),ncol=6))
df
#   X1 X2 X3 X4 X5 X6
# 1 27 86 19 43 75 29
# 2 37 97 16 88 17  1
# 3 57 62 61 83 51 28
# 4 89 58 34 32 10 81
# 5 20  6 67 63 21 25

df[,1:3] <- df[,4:6]                    # very, very straightforward...
df
#   X1 X2 X3 X4 X5 X6
# 1 43 75 29 43 75 29
# 2 88 17  1 88 17  1
# 3 83 51 28 83 51 28
# 4 32 10 81 32 10 81
# 5 63 21 25 63 21 25

With data.tables, not so much:

library(data.table)
dt <- data.table(df)
dt[,1:3,with=F] <- dt[,4:6,with=F]
## Error in `[<-.data.table`(`*tmp*`, , 1:3, with = F, value = list(X4 = c(43L,  : unused argument (with = F)

This works, but seems extremely complicated for such a simple transformation:

dt[, names(dt)[1:3]:=dt[,4:6,with=F]]   # very, very complicated...
dt
#    X1 X2 X3 X4 X5 X6
# 1: 43 75 29 43 75 29
# 2: 88 17  1 88 17  1
# 3: 83 51 28 83 51 28
# 4: 32 10 81 32 10 81
# 5: 63 21 25 63 21 25

The question is: is there a simpler way to assign one set of columns in a data table to the values from another set of columns in the same data table?

like image 789
jlhoward Avatar asked Dec 04 '13 18:12

jlhoward


People also ask

How do you create a multi variable data table in Excel?

Go to the Data tab > Data Tools group, click the What-If Analysis button, and then click Data Table… In the Data Table dialog window, click in the Column Input cell box (because our Investment values are in a column), and select the variable cell referenced in your formula.

How do you make a table with multiple variables?

Creating a table with lots of variables. You can create tables with an unlimited number of variables by selecting Insert > Analysis > More and then selecting Tables > Multiway Table. For example, the table below shows Average monthly bill by Occupation, Work Status, and Gender.


1 Answers

Perhaps a for loop would look better?

for (i in 1:3) dt[[i]] = dt[[i+3]]
like image 93
eddi Avatar answered Oct 06 '22 17:10

eddi