R我应该怎么做?根据某些条件指定列和行

R我应该怎么做?根据某些条件指定列和行,r,dplyr,R,Dplyr,我创建了自己的函数,但在运行时遇到了一些问题 # condition and target_col must be str, modify<-function(data,target_col,condition,value){ row_index <- which(eval(parse(text=condition)) data[row_index,target_col]<-value return(data) } #条件和目标列必须为str, 修改这应该有效: lib

我创建了自己的函数,但在运行时遇到了一些问题

# condition and target_col  must be str, 
modify<-function(data,target_col,condition,value){
row_index <- which(eval(parse(text=condition))
data[row_index,target_col]<-value 
return(data)
}
#条件和目标列必须为str,
修改这应该有效:

library(rlang)
library(magrittr)

#' @param data dataframe
#' @param cond_col character. Name of column containing condition is based on. 
#' @param cond vector. Vector containing values to check for in \code{cond_col}. 
#' @param target_col character. Name of column to modify. 
#' @param value vector of length 1. Value to replace with in column \code{target_col}. 
modify <- function(data, cond_col, cond, target_col, value){
  init_factor <- is.factor(data[[target_col]])
  if(init_factor) data[,target_col] <- as.character(data[[target_col]])
  data %<>%
    dplyr::mutate(!!target_col := ifelse(!!ensym(cond_col) %in% cond,
                                         value, 
                                         .data[[target_col]]))
  if(init_factor) data[,target_col] <- as.factor(data[[target_col]])
  data
}
库(rlang)
图书馆(magrittr)
#“@param数据帧”
#“@param cond_col字符。包含条件的列的名称基于。
#“@param cond vector。包含要在\code{cond\u col}中检查的值的向量。
#“@param target_col字符。要修改的列的名称。
#“@param长度为1的值向量。要在列\code{target\u col}中替换的值。

修改你想做什么?您能显示您的预期输出吗?在我阅读您的问题时,仅当另一列中的对应元素具有一组值中的一个时,您才希望更改一列中的元素。例如,如果列
c
中的元素具有值“z”,则将列
a
中的相应元素更改为1。是这样吗?如果是这样,我认为您提到的这种方法应该是有效的:
result%mutate(a=ifelse(c%在%cond_上下文中,1,a))
(假设
cond_上下文
为“z”)。它似乎比不必要的长
eval(parse(…)
方法优雅得多。我使用循环和系统。时间比较,当然我的函数非常有效,我做了改进,直接使用eval()。
result<-data%>%mutate(a=ifelse(c%in%cond_context,1,a))
result<-data%>%modify("a","data$c%in%cond_cotext",1)
#first  i can't use %>% smoothly

data%>%mutate(d=1)%>%modify("a","data$d%in%cond_context",1)
this is wrong,  function can't find data$d obj,
i must use like this
data<-data%>%mutate(d=1)
data<-data%>%modify("a","data$d%in%cond_context",1)
# sencond i can't when i use this in a function ,it report cat't find cond_context,i don't know how to solve this proble, but it is ok run step by step on environment. 
result<-data%>%modify(a,c%in%cond_cotext,1)
library(rlang)
library(magrittr)

#' @param data dataframe
#' @param cond_col character. Name of column containing condition is based on. 
#' @param cond vector. Vector containing values to check for in \code{cond_col}. 
#' @param target_col character. Name of column to modify. 
#' @param value vector of length 1. Value to replace with in column \code{target_col}. 
modify <- function(data, cond_col, cond, target_col, value){
  init_factor <- is.factor(data[[target_col]])
  if(init_factor) data[,target_col] <- as.character(data[[target_col]])
  data %<>%
    dplyr::mutate(!!target_col := ifelse(!!ensym(cond_col) %in% cond,
                                         value, 
                                         .data[[target_col]]))
  if(init_factor) data[,target_col] <- as.factor(data[[target_col]])
  data
}
test_df <- data.frame(x = 1:2, y = "a")
modify(test_df, "x", 1, "y", "b")
  x y
1 1 b
2 2 a