Создать новый столбец фрейма данных - PullRequest
2 голосов
/ 10 февраля 2020

Мой фрейм данных выглядит так:

df <- data.frame(INFO=c("A;B;C", "B;A;C"), METRICS=c("1;2;3", "4;5;6"))
df
   INFO METRICS
1 A;B;C   1;2;3
2 B;A;C   4;5;6

Я пытаюсь поймать значение 'A' для каждой строки, используя apply(), и сохранить полученный вектор в новом столбце моих исходных данных. frame:

df$M1 <- apply(
   df,
   1,
   function(x){
      info <- unlist(strsplit(x[1], ";"))
      metric <- unlist(strsplit(x[2], ";"))
      for(i in 1:3){
         ifelse(
            info[i]=="A", 
            metric[i],
            "."
         )
      }
   }
)

Чтобы получить следующий результат:

df
   INFO METRICS M1
1 A;B;C   1;2;3  1
2 B;A;C   4;5;6  5

Но новый столбец не создан.

Ответы [ 4 ]

1 голос
/ 10 февраля 2020

Вы также можете попробовать grepRaw():

ind <- sapply(df$INFO, grepRaw, pattern = "A", fixed = TRUE)
substring(df$METRICS, ind, ind)

[1] "1" "5"
1 голос
/ 10 февраля 2020

Может быть, вы можете попробовать apply, как показано ниже

df$M1<-apply(df, 1, function(x) {
  unlist(strsplit(x[2],split = ";"))[unlist(strsplit(x[1],";"))=="A"]
})

, такой что

> df
   INFO METRICS M1
1 A;B;C   1;2;3  1
2 B;A;C   4;5;6  5
1 голос
/ 10 февраля 2020

Векторизованный способ сделать это - удалить список после разбиения и сделать его именованным вектором, то есть

i1 <- setNames(unlist(strsplit(as.character(df$METRICS), ';')), 
               unlist(strsplit(as.character(df$INFO), ';')))

, а затем просто

i1[names(i1) == 'A']
#  A   A 
#"1" "5" 

Или добавить его в свой фрейм данных. ,

 df$M1 <- i1[names(i1) == 'A']

#   INFO METRICS M1
#1 A;B;C   1;2;3  1
#2 B;A;C   4;5;6  5
1 голос
/ 10 февраля 2020

Мы можем разбить строку на ";" и использовать mapply, чтобы получить соответствующее значение METRICS, где INFO == "A".

df$M1 <- mapply(function(x, y) y[x == "A"], strsplit(df$INFO, ";"),
                                            strsplit(df$METRICS, ";"))
df

#   INFO METRICS M1
#1 A;B;C   1;2;3  1
#2 B;A;C   4;5;6  5

data

Убедитесь, что данные читаются как символы, а не как факторы.

df <- data.frame(INFO=c("A;B;C", "B;A;C"), METRICS=c("1;2;3", "4;5;6"),
                  stringsAsFactors = FALSE)
...