排列数据,如果某些列没有值,则创建一个新列并在其中添加该值

TO arrange the data such that if the some column have no values then create a new column and add that value in that

我有一个数据框,我想复制 STATE 并将其粘贴到另一列。我该怎么办,请帮我解决这个问题

         Market        Origin              Variety      
 1 Andhra Pradesh                                         
 2  Achanta              32                  MTU-1010 
 3   Addanki             4                 B P T 
 4   Akiveedu            2                  MTU-1010 
 5   Assam                               
 6 Amadalavalasa        60                 Paddy 

Full Data

我想要这个:

     Market            Origin              Variety            STATE                           
     2  Achanta         32               MTU-1010         Andra Pradesh
     3   Addanki         4               B P T            Andra Pradesh
     4   Addanki         2               MTU-1010         Andra Pradesh
     6 Amadalavalasa     60               Paddy              Assam

  library(plyr)
 abc <- ddply(abc,.variables= c("Market",
                     "Origin","Variety"),
    function(t) {
      x <- t$Market
      abc <- cbind(abc,STATE = x)
    }  
       )


  ##The below code is working fine but the above code is not working according to my need
 abc <- abc[ ! ( abc$Origin =="" & abc$Variety== "") , ] 

这是一个基本的 for 循环解决方案。
让我们从一些数据开始:

x <- data.frame(Market = c("State A", "City A", "City B", "City C", "State B", "City A"), 
                Origin = c(NA, 32, 4, 2, NA, 60))

然后我们创建一个State Variable和一个结果数据框:

x$State <- NA
res <- x[0, ]

之后我们遍历所有行并检查条件。对于值为 Origin 的行,将插入州。

for (i in 1:nrow(x)){
  if (is.na(x$Origin[i])){
    statetmp <- x$Market[i]
  } else {
    newrow <- x[i,]
    newrow$State <- statetmp
    res <- rbind(res, newrow)
  }
}
res
#   Market Origin   State
# 2 City A     32 State A
# 3 City B      4 State A
# 4 City C      2 State A
# 6 City A     60 State B

你也可以试试:

df  <- data.frame(Market = c("State A", "City A", "City B", "City C", "State B", "City A"), 
                  Origin = c(NA, 32, 4, 2, NA, 60))

library(tidyverse)
library(zoo)

df %>%
  mutate(state = if_else(is.na(Origin), Market, NULL)) %>%
  mutate(state = na.locf(state)) %>%
  filter(!is.na(Origin))

给出:

  Market Origin   state
1 City A     32 State A
2 City B      4 State A
3 City C      2 State A
4 City A     60 State B