База R:
colSums(rowsum(df[, -1], df[, 1]) > 0)
#x y z k
#4 4 2 3
Позвольте мне сначала ответить на ваш второй вопрос:
expressionNames
используются для интерполяции. Это означает, что после интерполяции этот объект выражения фильтра:
"expression": "#partitionKey = :value",
"expressionNames": {
"#partitionKey": "id"
}
будет преобразован в:
"expression": "id = :value",
#partitionKey
действует как заполнитель для имени вашего столбца id
, '#'
оказывается разделителем.
expressionNames
необходимы, потому что некоторые ключевые слова зарезервированы DynamoDB , что означает, что вы не можете использовать эти слова внутри выражения DynamoDB.
Когда вам нужно сравнить что-либо в выражении DynamoDB, вам также потребуется использовать замену фактического значения с использованием заполнителя, поскольку типизированное значение DynamoDB является сложным объектом. [тысяча сто двадцать семь]
В следующем примере:
"expression": "myKey = :partitionKey",
"expressionValues": {
":partitionKey": {
"S": "123"
}
}
:partitionKey
является заполнителем для комплексного значения
{
"S": "123"
}
':'
- это другой разделитель, который сообщает DynamoDB использовать [ 1111] карта при замене.
expressionNames
и expressionValues
всегда используются при генерации кода? Просто для логики генерации кода всегда проще использовать expressionNames
и expressionValues
, потому что нет необходимости иметь два кодовых пути для зарезервированных / незарезервированных слов DynamoDB. Использование expressionNames
всегда предотвращает столкновения!