逐行替换data.frame中的值

时间:2018-03-13 11:10:04

标签: r grep

我想创建一个新列,其中x的所有条目都在其中,对于出现在同一行的y列中的那些部分。

data<-data.frame(x = 
 c("Leo Messi","Frank Ribery","Mats Hummels", "Leo Hummels", "Leo Ribery"),  
 y = c("Leo", "Ribery",  "Mats", NA, "Mama")
)

这是我想要的输出。 列z是x而没有y的条目。 列q是被替换的部分。 重要的是,在第4行中,Leo不会被替换。第1行是列y中的Leo,但这不应该导致替换。

         x         y      z            q
1    Leo Messi    Leo    Messi        Leo 
2 Frank Ribery Ribery    Frank        Ribery
3 Mats Hummels   Mats    Hummels      Mats 
4  Leo Hummels   <NA>    Leo Hummels  <NA>  
5   Leo Ribery   Mama    Leo Ribery   <NA>

3 个答案:

答案 0 :(得分:3)

我认为以下内容应该有效。我已经使用了一些包来进行矢量化/效率

var tr = document.createElement("TR");
 var td=document.createElement("TD");
    txt=document.createElement('SELECT');
    txt.style.width = '285px';
    txt.maxLength = 50;
    var option = document.createElement("option");
    option.text = "Larry";
    option.value = "10001";
    txt.add(option);
    var option = document.createElement("option");
    option.text = "Nancy";
    option.value = "10002";
    txt.add(option);
    txt.setAttribute("class","form-control");
    td.setAttribute("align","center");
    td.appendChild(txt);
    tr.appendChild(td);
    document.getElementById("tblGroup").appendChild(tr);

答案 1 :(得分:0)

试试这段代码:

您的数据

var _this = this

z计算

data<-data.frame(x = c("Leo Messi","Frank Ribery","Mats Hummels", "Leo Hummels", "Leo Ribery"), y = c("Leo", "Ribery",  "Mats", NA, "Mama"))

    all<-as.character(data$x)
    to_sub<-as.character(data$y)
    i<-rep(1:length(all))

q计算

f_gsub<-function(x,y,i){ gsub(y[i],"",x[i]) }
data$z<-unlist(lapply(i,f_gsub,x=all,y=to_sub))
data[is.na(data$z),"z"]<-as.character(data[is.na(data$z),"x"])

数据

f_grepl<-function(x,y,i){ grepl(y[i],x[i]) }
sub_YN<-as.logical(unlist(lapply(i,f_grepl,x=all,y=to_sub)))
data$q<-NA
data[!is.na(sub_YN),"q"]<-to_sub[sub_YN]

答案 2 :(得分:0)

以下是使用dplyrstringrstringi的解决方案:

library(dplyr)
library(stringr)
library(stringi)

data %>% 
  mutate_if(is.factor, as.character) %>% # can be avoided if we use stringsAsFactors = FALSE when creating the data frame
  mutate(z = str_squish(stri_replace_all_fixed(x, y, "")),
         z = case_when(is.na(y) ~ x, TRUE ~ z),
         q = case_when(x %in% z == FALSE ~ y))

返回:

             x      y           z      q
1    Leo Messi    Leo       Messi    Leo
2 Frank Ribery Ribery       Frank Ribery
3 Mats Hummels   Mats     Hummels   Mats
4  Leo Hummels   <NA> Leo Hummels   <NA>
5   Leo Ribery   Mama  Leo Ribery   <NA>