首页 > 解决方案 > R:你如何运行一个函数来获取多个列?

问题描述

所以我的数据看起来像这样

   id first  middle  last       Age
    1 Carol  Jenny   Smith      15
    2 Sarah  Carol   Roberts    20
    3 Josh   David   Richardson 22

我有一个函数可以创建一个新列,它为您提供在我指定的先前列(第 2-4 列或“第一”:“最后”列)中为每一行找到名称的次数。我有一个函数可以输出下面的结果,

funname <- function(df, cols, value, newcolunmn) {
  df$newcolumn <- as.integer(rowSums(df[cols] == value) > 0)
}
   id first  middle  last       Age  Carol
    1 Carol   Jenny   Smith      15    1
    2 Sarah  Carol   Roberts     20    1
    3 Josh   David   Richardson  22    0

但我的真实数据更复杂,我想创建至少 20 个新的不同列(例如:Carol、Robert、Jenny、Anna、Richard、Daniel、Eric...)那么我怎样才能将多个新列合并到现有的列中?功能?我只能考虑添加函数(df,cols,value,newcolumn1,newcolumn2,newcolumn3,...,)但是如果我以后想要一百列,这将是不可能的,..有什么帮助吗?先感谢您!:)

编辑:

 function(df, cols, value, newcol) {

   df$newcol <- as.integer(rowSums(df[cols] == value) > 0)
   df 
}

我阅读了下面的评论..但是让我改变我的问题..我将如何映射这个函数,以便我可以生成多个具有我想要分配的新名称的列?...

标签: rfunctionapply

解决方案


如果您将数据转换为两个长向量,一个表示行号,另一个表示值,我认为这只是一个巨大的表操作:

tab <- as.data.frame.matrix(table(row(dat[2:4]), unlist(dat[2:4])))
cbind(dat, tab)
#  id first middle       last Age Carol David Jenny Josh Richardson Roberts Sarah Smith
#1  1 Carol  Jenny      Smith  15     1     0     1    0          0       0     0     1
#2  2 Sarah  Carol    Roberts  20     1     0     0    0          0       1     1     0
#3  3  Josh  David Richardson  22     0     1     0    1          1       0     0     0

如果需要,此方法还允许您将新的输出列映射到名称的变体:

tab <- as.data.frame.matrix(table(row(dat[2:4]), unlist(dat[2:4])))
dat[paste0(colnames(tab),"_n")] <- tab
dat
#  id first middle       last Age Carol_n David_n Jenny_n Josh_n Richardson_n Roberts_n Sarah_n Smith_n
#1  1 Carol  Jenny      Smith  15       1       0       1      0            0         0       0       1
#2  2 Sarah  Carol    Roberts  20       1       0       0      0            0         1       1       0
#3  3  Josh  David Richardson  22       0       1       0      1            1         0       0       0

推荐阅读