我有一个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&#34; A&#34;,只包含正确答案并用空单元格替换错误答案/ 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")
非常感谢您的回复!
答案 0 :(得分:3)
您可以使用grep
执行此操作。根据“ana”列创建您想要成为非NA的vector
个元素。
v1 <- c('ehre', 'seil', 'leiht', 'fiel')
我们paste
这些collapse='|'
与pattern
中的grep
参数一起 pat <- paste0('^(', paste(v1, collapse='|'), ')$')
indx <- grepl('^ana', colnames(B))
为'ana'列
创建索引 A1 <- B[,indx]
我正在创建一个新对象'A1',它将是仅具有'ana'列的修改矩阵'B'。
grepl
!
的输出将是一个逻辑向量。我们否定(NA
)它并将'A1'中列的相应元素分配给A1[!grepl(pat, A1)] <- NA
!is.na(A1)
要创建'points'列(虽然在示例中它已经创建),我们在'ana'列(rowSums
)中获得非NA值的逻辑索引,得到{{1与原始数据集一起使用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'中可能会更好,因为'Points'是一个'数字'向量,通过将其保持在matrix
({{1}只能有一个matrix
)。
答案 1 :(得分:2)
我从您的B
开始,它也恰好包含"points"
,但该列不是必需的。我后来重新创建了它。因此,我首先将所有不匹配更改为NA
,然后计算每行中的非NA数(忽略"points"
列)以计算得分。 correct
对象只是您正在寻找的正确答案的向量。
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")
correct <- c("ehre","fiel","seil","leiht")
A <- B
A[!A%in%correct] <- NA
A[,"points"] <- apply(A[,colnames(A)!="points"], 1, function(x)sum(!is.na(x))) #tally up non-NA's to indicate points
此过程导致A
的以下输出:
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"