我有以下类型的138x50数据框:

B = matrix( c("ehre","e", "eh", "ehr", "ehrr", "f", "fi", "fie", "fiee", "fiel", "seil", "s", "se", "sei", "seii", "leiht", "l", "le", "lei", "leih", 3, 0, 0, 0, 1), nrow=5, ncol=5, byrow = FALSE)
colnames(B)<-c("ana1_1", "ana2_1", "ana3_1", "ana4_1", "points")


我想创建一个新的df“ A”,仅包含正确答案,并用一个空单元格/ NA替换错误答案:

A = matrix( c("ehre",NA, NA, NA, NA, NA, NA, NA, NA, "fiel", "seil", NA, NA, NA, NA, "leiht", NA, NA, NA, NA, 3, 0, 0, 0, 1), nrow=5, ncol=5, byrow = FALSE)
colnames(A)<-c("ana1_1", "ana2_1", "ana3_1", "ana4_1", "points")



如何创建A,而不是删除错误,而是选择正确的答案? (因为这将要求输入更少的答案)。
如何计算一行中的字符串数(以创建第5列)?


非常感谢您的回复!

最佳答案

您可以使用grep执行此操作。根据“ ana”列,创建要作为非NA元素的vector

 v1 <- c('ehre', 'seil', 'leiht', 'fiel')


我们将pastecollapse='|'一起用作pattern中的grep参数

 pat <- paste0('^(', paste(v1, collapse='|'), ')$')


为“ ana”列创建索引

 indx <- grepl('^ana', colnames(B))


我正在创建一个新对象“ A1”,它将是仅具有“ ana”列的修改后的矩阵“ B”。

 A1 <- B[,indx]


grepl的输出将是逻辑向量。我们将其取反(!)并将'A1'中各列的对应元素分配给NA

A1[!grepl(pat, A1)] <- NA


要创建“点”列(尽管在示例中已经创建),我们在“ ana”列(!is.na(A1))中获得非NA值的逻辑索引,并获得rowSumscbind与原始数据集。

cbind(A1, Points=rowSums(!is.na(A1)))
#     ana1_1 ana2_1 ana3_1 ana4_1  Points
#[1,] "ehre" NA     "seil" "leiht" "3"
#[2,] NA     NA     NA     NA      "0"
#[3,] NA     NA     NA     NA      "0"
#[4,] NA     NA     NA     NA      "0"
#[5,] NA     "fiel" NA     NA      "1"


最好将结果存储在“ data.frame”中,因为“点”是“数字”向量,可以通过将其保存在matrix中来转换为“字符”(因为matrix只能有一个class)。

10-04 19:09