Манипулировать значением dataframe для соответствия различным столбцам - PullRequest
0 голосов
/ 22 марта 2020

У меня есть датафрейм, как показано ниже. Если для кластера указано NA, то я хочу найти столбец «id» в столбце «To» и заполнить New_Col значением кластера соответствующей строки.

id  cluster from    to
A   NA      NA      NA
B   2       B       D
C   5       C       A
D   NA      NA      NA
E   5       E       B
F   NA      NA      NA
G   3       G       F

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

id  cluster from    to  New_Col
A   NA      NA      NA  5
B   2       B       D   2
C   5       C       A   5
D   NA      NA      NA  2
E   5       E       B   5
F   NA      NA      NA  3
G   3       G       F   3

Ответы [ 3 ]

2 голосов
/ 22 марта 2020

Мы можем использовать match:

#Copy cluster value
df$New_col <- df$cluster
#Get NA indices
inds <- is.na(df$New_col)
#Get corresponding cluster values for NA values.
df$New_col[inds] <- with(df, cluster[match(id[inds], to)])
df

#  id cluster from   to New_col
#1  A      NA <NA> <NA>       5
#2  B       2    B    D       2
#3  C       5    C    A       5
#4  D      NA <NA> <NA>       2
#5  E       5    E    B       5
#6  F      NA <NA> <NA>       3
#7  G       3    G    F       3

данные

df <- structure(list(id = structure(1:7, .Label = c("A", "B", "C", 
"D", "E", "F", "G"), class = "factor"), cluster = c(NA, 2L, 5L, 
NA, 5L, NA, 3L), from = structure(c(NA, 1L, 2L, NA, 3L, NA, 4L
), .Label = c("B", "C", "E", "G"), class = "factor"), to = structure(c(NA, 
3L, 1L, NA, 2L, NA, 4L), .Label = c("A", "B", "D", "F"), class = "factor")), 
class = "data.frame", row.names = c(NA, -7L))
1 голос
/ 22 марта 2020

Использование логики @Ronak Shah c (решение Base R):

df$new_col <-  ifelse(is.na(df$cluster), df$cluster[match(df$id, df$to)], df$cluster)
0 голосов
/ 22 марта 2020

Вот еще один вариант использования for l oop и which

. Используйте which, чтобы найти индекс, где столбец «to» соответствует столбцу «id», когда столбец «cluster» является NA

for (i in 1:length(df$cluster)){
      df$new_col[i] =  ifelse(is.na(df$cluster[i])==T,df$cluster[which(df$to==df$id[i])],df$cluster[i])
    }

данные

df <- data.frame(id= c("A", "B", "C","D", "E", "F", "G"),
                 cluster = c(NA, 2L, 5L,NA, 5L, NA, 3L),
                 from =c(NA, "B", "C",NA, "E", NA, "G"),
                 to = c(NA, "D", "A",NA, "B", NA, "F"), stringsAsFactors = F)

выход

df
  id cluster from   to new_col
1  A      NA <NA> <NA>       5
2  B       2    B    D       2
3  C       5    C    A       5
4  D      NA <NA> <NA>       2
5  E       5    E    B       5
6  F      NA <NA> <NA>       3
7  G       3    G    F       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...