Как найти конкретные строки в dataframe, используя для цикла? - PullRequest
0 голосов
/ 12 декабря 2018

Я использую цикл for, чтобы найти все конкретные строки (df2 $ x2) в другом фрейме данных (df1 $ x1), и моя цель - создать новый столбец теста df1 $ и записать значение df $ x2.

Например:

df1 <- data.frame(x1 = c("TE-T6-3 XYZ12X","TE-D31L-2 QWE12X","TE-H6-1 ABC12X","TE-D31L-2 QWE12X","EC20 QWX12X"),
                  Y = c(2017,2017,2018,2018,2017),
                  Sales = c(25,50,30,40,90))
df1$x1 <- as.character(as.factor(df1$x1))

df2 <- data.frame(x2 = c("TE-T6-5","TE-D31L-2","TE-H6-15","EC500","EC20","TE-D31L-2"),
                  Y = c(2018,2017,2018,2017,2018,2018),
                  P = c(100,300,200,50,150,300))
df2$x2 <- as.character(as.factor(df2$x2))

for(i in 1:nrow(df2)){

  f <- df2[i,1]

  df1$test <- ifelse(grepl(f, df1$x1),f,"not found")

}

Что мне делать после окончания цикла?Я знаю, что проблема в том, что ты каждый раз освежаешься.Я попытался использовать оператор if, чтобы создать новый фрейм данных и сохранить результаты, но это не сработало.Он пишет только одну конкретную строку.

Заранее спасибо.

Ожидаемый результат:

df1 <- data.frame(x1 = c("TE-T6-3 XYZ12X","TE-D31L-2 QWE12X","TE-H6-1 ABC12X","TE-D31L-2 QWE12X","EC20 QWX12X"),
             output = c("not found","TE-D31L-2","not found","TE-D31L-2","EC20"))

enter image description here

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Хотите ли вы иметь один новый столбец для каждой строки?если это то, что вам нужно, ваш код должен быть:

df1 <- data.frame(x1 = c("TE-T6-3 XYZ12X","TE-D31L-2 QWE12X","TE-H6-1 ABC12X","TE-D31L-2 QWE12X","EC20 QWX12X"),
                  Y = c(2017,2017,2018,2018,2017),
                  Sales = c(25,50,30,40,90))
df1$x1 <- as.character(as.factor(df1$x1))

df2 <- data.frame(x2 = c("TE-T6-5","TE-D31L-2","TE-H6-15","EC500","EC20","TE-D31L-2"),
                  Y = c(2018,2017,2018,2017,2018,2018),
                  P = c(100,300,200,50,150,300))
df2$x2 <- as.character(as.factor(df2$x2))

for(i in 1:nrow(df2)){

  f <- df2[i,1]
  df1$test <- ""
  df1$test<-ifelse(grepl(f, df1$x1),T,F)
  colnames(df1) <- c(colnames(df1[1:length(df1[1,])-1]),f)

}

, он создает новый столбец с временным именем и затем переименовывает его с оцененной строкой.Также я изменяю «not found» для F, но вы можете использовать все, что вы хотите.

[EDIT:] Если вы хотите получить ожидаемый результат, вы можете использовать этот код:

df1 <- data.frame(x1 = c("TE-T6-3 XYZ12X","TE-D31L-2 QWE12X","TE-H6-1 ABC12X","TE-D31L-2 QWE12X","EC20 QWX12X"),
                  Y = c(2017,2017,2018,2018,2017),
                  Sales = c(25,50,30,40,90))
df1$x1 <- as.character(as.factor(df1$x1))

df2 <- data.frame(x2 = c("TE-T6-5","TE-D31L-2","TE-H6-15","EC500","EC20","TE-D31L-2"),
                  Y = c(2018,2017,2018,2017,2018,2018),
                  P = c(100,300,200,50,150,300))
df2$x2 <- as.character(as.factor(df2$x2))
df1$output <- "not found"

for(i in 1:nrow(df2)){
  f <- df2[i,1]
  df1$output[grepl(f, df1$x1)]<-f

}

Очень похоже на то, что вы сделали, но нужно было проиндексировать, какие строки вы должны написать.Это работает только тогда, когда данные могут иметь только одно совпадение, это немного сложнее, если вы можете иметь более одного совпадения для строки.Но я думаю, что это не твоя проблема.

0 голосов
/ 12 декабря 2018

Вам просто нужно разбить строки df1$x1 на пробелы и объединить (или match, поскольку вас интересует только одна переменная) на df2$x2, то есть

v1 <- sub('\\s+.*', '', df1$x1)
v1[match(v1, df2$x2)]
#[1] NA          "TE-D31L-2" NA          "TE-D31L-2" "EC20"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...