R:如何运行函数来获取多个列?
我的数据是这样的R:如何运行函数来获取多个列?,r,function,apply,R,Function,Apply,我的数据是这样的 id first middle last Age 1 Carol Jenny Smith 15 2 Sarah Carol Roberts 20 3 Josh David Richardson 22 我有一个函数,可以创建一个新列,它可以告诉您在我指定的第二列到第四列或“第一列”:“最后一列”的前几列中找到每行名称的次数。我有一个输出以下结果的函数 funname <- function(
id first middle last Age
1 Carol Jenny Smith 15
2 Sarah Carol Roberts 20
3 Josh David Richardson 22
我有一个函数,可以创建一个新列,它可以告诉您在我指定的第二列到第四列或“第一列”:“最后一列”的前几列中找到每行名称的次数。我有一个输出以下结果的函数
funname <- function(df, cols, value, newcolunmn) {
df$newcolumn <- as.integer(rowSums(df[cols] == value) > 0)
}
但我的真实数据更复杂,我想创建至少20个新的、不同的专栏,例如:卡罗尔、罗伯特、珍妮、安娜、理查德、丹尼尔、埃里克。。。
那么,如何将多个新列合并到现有函数中呢?
我只能考虑添加函数df,cols,value,newcolumn1,newcolumn2,newcolumn3,…,但是如果我以后想添加100个列,这是不可能的,…有什么帮助吗?提前谢谢你!:
编辑:
我读了下面的评论,但让我改变我的问题。。
如何映射此函数,以便生成多个具有要分配的新名称的列?。如果将数据转换为两个长向量,一个表示行号,另一个表示值,我认为这只是一个巨大的表操作:
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
演示如何执行此操作。另外,你可以用类似的方式来适应上面提到的问题。顺便说一下,如果Ronak Shah以前的回答解决了这个问题,您应该单击他回答旁边的“接受”复选标记,让人们知道找到了解决方案。@eipi10找到了!非常感谢。嗯…我在帖子中写的函数不是很安静。如果有人能帮忙,请帮忙!请使用dput提供一个数据示例,例如,将dputdf[1:3]的输出粘贴到问题中,并将您正在运行的代码粘贴到问题中,以尝试添加多个列。我认为,如果您将数据转换为两个长向量,一个表示行号,另一个表示值,那么这只是一个巨大的表操作。例如:tablerowdat[2:4],unlistdat[2:4]按照通常的长格式,“整洁”数据在概念上更容易处理,无论您是否使用“整洁”软件包。。。。
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