mand3rd
mand3rd

Reputation: 393

Using a column as a column index to extract value from a data frame in R

I am trying to use the values from a column to extract column numbers in a data frame. My problem is similar to this topic in r-bloggers. Copying the script here:

df <- data.frame(x = c(1, 2, 3, 4),
                 y = c(5, 6, 7, 8),
                 choice = c("x", "y", "x", "z"),
                 stringsAsFactors = FALSE)

However, instead of having column names in choice, I have column index number, such that my data frame looks like this:

df <- data.frame(x = c(1, 2, 3, 4),
                 y = c(5, 6, 7, 8),
                 choice = c(1, 2, 1, 3),
                 stringsAsFactors = FALSE)

I tried using this solution:

df$newValue <-
  df[cbind(
    seq_len(nrow(df)),
    match(df$choice, colnames(df))
  )]

Instead of giving me an output that looks like this:

#   x y choice newValue
# 1 1 4   1        1
# 2 2 5   2        2
# 3 3 6   1        6
# 4 8 9   3        NA

My newValue column returns all NAs.

    # x y choice newValue
    # 1 1 4   1        NA
    # 2 2 5   2        NA
    # 3 3 6   1        NA
    # 4 8 9   3        NA

What should I modify in the code so that it would read my choice column as column index?

Upvotes: 1

Views: 807

Answers (1)

Ronak Shah
Ronak Shah

Reputation: 388797

As you have column numbers which we need to extract from data frame already we don't need match here. However, since there is a column called choice in the data which you don't want to consider while extracting data we need to turn the values which are not in the range to NA before subsetting from the dataframe.

mat <- cbind(seq_len(nrow(df)), df$choice)
mat[mat[, 2] > (ncol(df) -1), ] <- NA 
df$newValue <- df[mat]

df
#  x y choice newValue
#1 1 5      1        1
#2 2 6      2        6
#3 3 7      1        3
#4 4 8      3       NA

data

df <- data.frame(x = c(1, 2, 3, 4),
                 y = c(5, 6, 7, 8),
                 choice = c(1, 2, 1, 3))

Upvotes: 3

Related Questions