我在替换数据帧中的值时遇到了一些问题.我想替换基于单独表格的值.下面是我试图做的一个例子.

我有一张桌子,每一行都是顾客,每一列都是他们购买的动物.我们把这个数据框称为table.

> table
#       P1     P2     P3
# 1    cat lizard parrot
# 2 lizard parrot    cat
# 3 parrot    cat lizard

我也有一个表,我会参考称为lookUp.

> lookUp
#      pet   class
# 1    cat  mammal
# 2 lizard reptile
# 3 parrot    bird

我想做的是创建一个名为new的新表,用一个函数将table中的所有值替换为lookUp中的class列.我自己try 了lapply个警告.

new <- as.data.frame(lapply(table, function(x) {
  gsub('.*', lookUp[match(x, lookUp$pet) ,2], x)}), stringsAsFactors = FALSE)

Warning messages:
1: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
  argument 'replacement' has length > 1 and only the first element will be used
2: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
  argument 'replacement' has length > 1 and only the first element will be used
3: In gsub(".*", lookUp[match(x, lookUp$pet), 2], x) :
  argument 'replacement' has length > 1 and only the first element will be used

有没有办法让这一切顺利进行?

推荐答案

你在问题中提出了一个不错的方法.这里有一个微笑的方法:

new <- df  # create a copy of df
# using lapply, loop over columns and match values to the look up table. store in "new".
new[] <- lapply(df, function(x) look$class[match(x, look$pet)])

另一种更快的方法是:

new <- df
new[] <- look$class[match(unlist(df), look$pet)]

请注意,我在这两种情况下都使用了空括号([]),以保持new的 struct 不变(data.frame).

(我在回答中用df代替table,用look代替lookup)

R相关问答推荐

R -列表元素中所有命名项的总和

返回句子中最长的偶数长单词

在特定列上滞后n行,同时扩展框架的长度

从API中抓取R数据SON

使用ggplot 2根据R中的类别排列Likert比例gplot

大规模重新标记haven标签数据

从R导出全局环境中的所有sf(numrames)对象

r替换lme S4对象的字符串的一部分

R函数‘paste`正在颠倒其参数的顺序

非线性混合效应模型(NLME)预测变量的置信区间

为什么我的基准测试会随着样本量的增加而出现一些波动?

R Read.table函数无法对制表符分隔的数据正常工作

如何在PackageStatus()中列出&q;不可用的包&q;?

派生程序包| ;无法检索';return()';的正文

根据另一列中的值和条件查找新列的值

调换行/列并将第一行(原始数据帧的第一列)提升为标题的Tidyr类似功能?

如何在R中改变fviz_pca_biplot中圆的边界线的 colored颜色 ?

为什么在写入CSV文件时Purrr::Pwalk不起作用

随机将数据帧中特定列上的某些行设置为NA

如何使用循环从R中的聚合函数创建列,而不会在名称中给出&q;$&q;?