除了我的替换要求是将那些(“1”)替换为该列所在的列的名称。
示例设置
df1<-data.frame(replicate(5,sample(0:1,5,rep=TRUE)))
row.names(df1)<-c("hootsuite","foodtank","FarmsNews","agchat","TysonFoods")
names(df1)<-c("food","agvocate","editor","gmo","ag")
food agvocate editor gmo ag
hootsuite 1 1 0 0 1
foodtank 1 1 0 0 1
FarmsNews 1 0 1 0 1
agchat 0 0 0 0 1
TysonFoods 1 0 1 1 0
会变成
food agvocate editor gmo ag
hootsuite food agvocate 0 0 ag
foodtank food agvocate 0 0 ag
FarmsNews food 0 editor 0 ag
agchat 0 0 0 0 ag
TysonFoods food 0 editor gmo 0
similar post中的解决方案
df1*df2[,1][col(df1)]
or
sweep(df1, 2, df2[,1], "*")
(使用下面定义的 df2)
df2<-c("food","agvocate","editor","gmo","ag")
df2<-as.matrix(df2)
row.names(df2)<-c("food","agvocate","editor","gmo","ag")
给出错误“FUN(左,右)中的错误:二元运算符的非数字参数”,这意味着矩阵乘法实际上不适用于字符;)
那么我应该采取什么方法?
最佳答案
我们可以使用Map
来替换
相应的列,其值为列名为1的值
df1[] <- Map(function(x, y) replace(x, x==1, y), df1, names(df1))
df1
# food agvocate editor gmo ag
#hootsuite food agvocate 0 0 ag
#foodtank food agvocate 0 0 ag
#FarmsNews food 0 editor 0 ag
#agchat 0 0 0 0 ag
#TysonFoods food 0 editor gmo 0
<小时/>
或者使用逻辑矩阵进行子集化和分配
df1[df1==1] <- names(df1)[col(df1)][df1==1]
关于使用另一个数据帧的行中的值替换一个数据帧的列中的所有值(按行名称列名称匹配),替换为字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47805026/