ddply/transform 不对字符向量的每个元素应用函数

ddply/transform does not apply function to each element of a character vector

我有一个数据框,我想使用我编写的名为 "group1":

的函数来转换第一列
group1 <- function(x) {
  temp <- strsplit(x,"_")[[1]][2]
  temp <- gsub("Yellow", "", temp)
  temp <- gsub("Blue", "", temp)
  as.numeric(temp)
}

例如,在字符串 "MHY_Blue23_Yellow16_11A" 上应用这个函数应该产生结果 23。当输入只是一个字符串时确实会发生这种情况,但是当我尝试在字符向量上应用这个函数时,出了点问题。我尝试使用 "transform" 使其适用于向量中的每个元素:

data_ling_RT2 <- transform(data_ling_RT, Group1 = group1(Code_Trials)))

但是我得到的数据框没有包含一个名为 "Group1" 的新列,它取决于 "Code_Trials" 中的相应元素,我得到 "Group1" 中的所有元素都基于仅在 "Code_Trials" 的第一个元素上。我想这与我写 "group1" 的方式有关,但我找不到我做错了什么。 使用 ddply 更糟糕 - 有时我什至在 "Group1"...

列中什么都得不到

非常感谢您的帮助!

我们仅使用 [[1]] 选择第一个 list 元素。因此,当我们使用 transform 时,第一个被修改的元素会循环到长度

我们可以通过在执行 gsub 之前使用 sapply 提取每个 list 元素的元素元素来更改 group1 函数。目前尚不清楚为什么我们要替换 'Yellow' 因为第二个元素似乎只有 'Blue'.

 group1 <- function(x) {
   temp <- strsplit(x,"_")
   temp <- sapply(temp, '[', 2) 
   temp <- gsub("Yellow", "", temp)
   temp <- gsub("Blue", "", temp)
   as.numeric(temp)
 }

以上代码可以简化为

 group2 <- function(x) {
     temp <- strsplit(x,"_")
      temp <- sapply(temp, '[', 2) 
      temp <- as.numeric(gsub('\D+', '', temp))
    }

使用可重现的例子

 data_ling_RT <- data.frame(Code_Trials= c("MHY_Blue23_Yellow16_11A" , 
       "MHY_Blue24_Yellow16_11A"), stringsAsFactors=FALSE)
 transform(data_ling_RT, Group1 = group1(Code_Trials))
 #              Code_Trials Group1
 #1 MHY_Blue23_Yellow16_11A     23
 #2 MHY_Blue24_Yellow16_11A     24