我有以下类型的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')
我们将
paste
与collapse='|'
一起用作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值的逻辑索引,并获得rowSums
和cbind
与原始数据集。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
)。